ios - 如何通过runtime修改系统类的一个property属性的初始值?

 独坤2602884605 发布于 2022-10-28 18:36

情况如下:
我们工程的主页是一个很长的tableView列表,想要实现点击顶部tableView自动滑至坐标原点处,系统的UIScrollView已经实现了这个功能,只要scrollingToTop这个属性是YES就可以了。然而!当这个页面的scrollView大于1个,同时这个属性值又都是YES(或者说同一页面下的这一属性值为YES的个数大于1)时,这个点击顶部的事件就不能触发,否则可以触发(理由是系统不知道把哪个scrollView的位移调回原点)。

理论上讲,如果scrollView.scrollingToTop的这个值的默认值是NO的话,我只需要把我需要实现跳转置顶功能的scrollView实例的这一属性设为YES就可以了, 然而坑爹的是:这个属性的默认值就是YES!

所以鄙人打算通过runtime把这个属性的默认值设为NO,这样这个问题就可以迎刃而解了!以后工程主页中在遇到相同的问题, 也可以解决了!

在这里我想补充解释一下,为什么不手动把其他的scrollview实例的scrollingToTop这个属性设为NO,理论上讲这样也可以实现同样的效果:
因为现实是残酷的,大多数工程都会是这样一种架构,简单举例就是,主页的三个TabBar关联的三个页面其实是捆绑在一个大的ScrollView容器中(横向),而每一个tab的页面中嵌套着多个小的scrollView,有一些封装好的小视图中的父类是scrollView,而他们的名字中并没有体现出scrollView,所以基于以上种种实际情况,一个个的找出所有无关的scrollView及其子类,并把它们的那个属性写成no的难度要远远高于使用runtime。

综上所述,求大神支招,如何通过runtime修改系统类的一个property属性的初始值?

2 个回答
  • #import <objc/runtime.h>
    
    @implementation UIScrollView (Tracking)
    
    +(void)load{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            SEL sel = @selector(initWithFrame:);
            SEL swizzSel = @selector(swiz_initWithFrame:);
            Method method = class_getInstanceMethod([self class], sel);
            Method swizzMethod = class_getInstanceMethod([self class], swizzSel);
            BOOL isAdd = class_addMethod(self, sel, method_getImplementation(swizzMethod), method_getTypeEncoding(swizzMethod));
            if (isAdd) {
                class_replaceMethod(self, swizzSel, method_getImplementation(method), method_getTypeEncoding(method));
            }else{
                method_exchangeImplementations(method, swizzMethod);
            }
        });
    }
    
    - (void)swiz_initWithFrame:(CGRect)frame{
        [self swiz_initWithFrame:frame];
        self.scrollsToTop = NO;
    }
    

    别打我,建了一个类别然后直接替换initWithFrame:方法了。。。

    2022-10-30 03:04 回答
  • KVC不行么?或者在每次view出现的时候将scrollToTop属性修改一下,每个页面只有一个scrollView(或者其子类)scrollToTop属性为YES是不会有冲突的。

    2022-10-30 03:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有