Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在子类上使用方法swizzle或其他东西_Ios_Objective C - Fatal编程技术网

Ios 如何在子类上使用方法swizzle或其他东西

Ios 如何在子类上使用方法swizzle或其他东西,ios,objective-c,Ios,Objective C,我的应用程序中有许多UITableViewController子类 现在我只需要修改它们,在所有情况下添加+1行,在所有情况下添加一个简单的相等行 我不想手动修改所有这些值,更好的方法是替换UITableViewDataSource方法,以如下方式修改值: +(void)load { [[self class] jr_swizzleMethod:@selector(tableView:numberOfRowsInSection:) withMethod:@selector(swizzledTab

我的应用程序中有许多UITableViewController子类

现在我只需要修改它们,在所有情况下添加+1行,在所有情况下添加一个简单的相等行

我不想手动修改所有这些值,更好的方法是替换UITableViewDataSource方法,以如下方式修改值:

+(void)load {
[[self class] jr_swizzleMethod:@selector(tableView:numberOfRowsInSection:) withMethod:@selector(swizzledTableView:numberOfRowsInSection:) error:nil];
}

- (NSInteger)swizzledTableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self swizzledTableView:tableView numberOfRowsInSection:section] + 1;
}

但它取代了超类函数,而超类函数在子类中不被调用,所以这不起作用。有没有方法可以在不修改所有子类的情况下做到这一点?

您将进入两个不同的领域,这两个领域需要充分理解才能正确使用,而且非常危险:在+load方法中执行代码,以及使用方法swizzling。我再也不敢在负载下做任何事了+如果你知道你在做什么,初始化是可以的,但是如果你在这里问问题,你甚至不能想到触摸+load

现在先问问自己:什么是类方法中的“self”,什么是“[self class]”?你认为这有可能奏效吗


我还建议您在谷歌上搜索“swizzle”,并选择其他一些代码进行方法swizzling。我觉得这很可疑。将其作为一个类别而不是一个普通的C函数来编写感觉非常糟糕

我几乎没有游泳的经验。但我有两种可能的解决办法

第一: 创建一个子类:YouBaseTableView:UITableView,并在YouBaseTableView中添加一行。并从YouBaseTableView继承所有表视图类

第二:
为UITableView创建一个扩展,并在此扩展中写入您的行。

您需要特别地swizzle每个子类。您可以通过在运行时使用
objc_getClassList
反省类层次结构来找到它们,但我无法开始描述这种方法有多么危险和脆弱。您正试图将此应用于系统中的每个tableview,您希望它只是您想要的tableview(即您的tableview)。但是,系统或第三方库可能使用的表视图呢?你也在修改它们。当您试图理解这导致的崩溃时,堆栈跟踪将由于旋转而无法理解

为了实现这一点,
tableView:cellforrowatinexpath:
还需要正确处理这一额外的行,因此在不知道+1的情况下,很难看到系统中的每个表视图控制器将如何正确实现


要么将您的表视图控制器子类化(并让它们调用
super
),要么使用它们都调用的单独对象来添加额外的行(如果需要)。另一个对象(或超类)也是处理这一额外行的单元格的位置。

我可能赶不上火车了。。。 但为了将来参考,该问题的解决方案将是swizzle UITableView的setDataSource,并将其替换为Nproxy实例。 通常没有人重写setDelegate/setDataSource方法,这将允许您关闭这些方法,拦截对这些委托的所有调用并交换实现


查看此链接了解更多信息:

提问是您学习的方式。你应该试着解释原因,而不是说感觉很糟糕。我从来没有想过方法swizzling子类方法,这让我非常好奇。你能不能在代码中引用一些示例来说明如何做到这一点?对不起,我不是原来的海报。但我只是很好奇。提前谢谢。我怀疑您是否能在现成的代码中找到示例。正如我所指出的,这是一种危险和脆弱的做法。但我描述的是调用
objc_getClassList
,然后遍历层次结构,查找您想要使用-isKindOfClass:的类的子类,然后修改它们。(但请注意:类可以稍后添加,不会通知您。)如果您需要如此疯狂的东西,更好的方法是KVO所做的,即对每个对象(而不是每个类)执行ISA swizzling:您可能会迟到,但恕我直言,这是最好的解决方案,对我来说效果很好。