ios - 如何通过runtime修改系统类的一个property属性的初始值?
阿神
阿神 2017-04-18 09:44:16
0
2
543

情况如下:
我们工程的主页是一个很长的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属性的初始值?

阿神
阿神

闭关修行中......

membalas semua(2)
迷茫

Bukankah KVC okay? Atau ubah suai atribut scrollToTop setiap kali paparan muncul Jika hanya terdapat satu scrollView (atau subkelasnya) pada setiap halaman, tidak akan ada konflik jika atribut scrollToTop ialah YA.

刘奇
#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;
}

Jangan pukul saya, cuma buat kategori dan kemudian terus ganti kaedah initWithFrame:. . .

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan