如何在Objective-C中使用运行时更改成员变量的值



我有一个tableView,我希望它的contentInsets始终为零。所以我添加代码:

class_replaceMethod([UITableView class], @selector(setContentInset:), (IMP)setContentInsetZero, "@");

然后我对setContentInsetsZero函数进行编码:

void setContentInsetZero(id SELF, SEL _cmd, UIEdgeInsets insets) {
    Ivar tableViewInsets = class_getInstanceVariable([UITableView class], "_contentInset");
    object_setIvar(SELF, tableViewInsets, [NSValue valueWithUIEdgeInsets:UIEdgeInsetsZero]);
} 

当程序运行时,它调用了setContentInsetZero函数,但它不起作用?有人能告诉我为什么吗?

您可以通过进一步使用swizzling方法来完成您想要做的事情。把你的新方法当作包装器而不是替换,它可以拦截参数并调用原始方法。

请查看此链接,了解完成所需操作的确切方法:http://nshipster.com/method-swizzling/

这将影响应用程序中的所有UITableView,更好的解决方案可能是将UITableView子类化并重写该方法(使用超级调用传递替换的参数)。然后你可以在需要的地方使用它。

最新更新