• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ios > 如何通过runtime修改系统类的一个property属性的初始值?

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

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了java runtime类,runtime类,java中runtime类,property类,runtime error等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 如何通过runtime修改系统类的一个property属性的初始值?
描述:

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


解决方案1:

#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:方法了。。。

解决方案2:

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


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-06-05 iOSUITableViewCell按钮点击状态为什么刷新以后会变回到为未点击状态
  • 2017-06-05 iOS如何在应用内禁止截屏。为了保护一些信息的传播
  • 2017-06-05 oc如何获得用Masonry约束好的宽度?
  • 2017-06-05 ipad2ios6到底該不該兼容iOS6?
  • 2017-06-05 UITableView点击cell的时候怎么改变sectionHeader的颜色?
  • 2017-06-05 讲带有第三方库和xib的文件打包成a静态库,怎么处理
  • 2017-06-05 iOS开发,如何跳转到系统设置页面。需适配iOS7-10
  • 2017-06-05 iOS登录注销逻辑问题
  • 2017-06-05 (swift)在一个uiview里放了4个tableview,为啥他们样式不一样啊
  • 2017-06-05 怎么实现UICollectionView放大,并且左右可以拖动

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • iOS免真机测试时报错一共运行过4台iphone有其中一个不能真机测试啦
    • (swift)brew安装mysql后找不到mysqlclientframework了
    • activity生命周期[iOS]监视某个VC生命周期函数
    • 使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?
    • App实现http长连接技术上可行吗?有必要吗?有哪些优缺点?
    • 错错错一错再错七牛SDK集成之后报错。
    • 阿里旺旺上不去集成阿里云旺导入sdk报错
    • oc调用c写的函数时出现Undefinedsymbolsforarchitecturearmv7,求懂混编的大神解答
    • nod32id获取器weexios如何获取设备id如UDID
    • iOSruntime探究(五):从runtime开始深入weak实现机理

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有