如何使用方法swizzle或在子类上的东西

我的应用程序中有许多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; } 

但是它取代了超类函数,这个函数在子类中没有被调用,所以这是行不通的。 有没有办法做到这一点,我想要的,而不修改所有的子类?

你需要特别调配每个子类。 您可以通过在运行时用objc_getClassList反思类层次结构来find它们,但是我不能开始描述这种方法有多危险和脆弱。 你试图把这个应用到系统中的每个tableview,你希望只是你所说的tableviews(即你的tableviews)。 但是那些可能被系统或第三方库使用的tableviews呢? 你也在修改它们。 而当你试图了解这个原因导致的崩溃时,堆栈跟踪将因混乱而变得无法理解。

为了使这个工作, tableView:cellForRowAtIndexPath:也需要正确处理这个额外的行,所以很难看到系统中的每个表视图控制器将如何正确实现,而不知道这个+1。

要么你的表视图控制器的子类(并让他们调用super ),或者使用一个单独的对象,他们都调用来添加额外的行,如果需要的话。 这另一个对象(或超类)也是你应该处理这个额外行的单元格的地方。

我几乎没有什么经验。 但我有两个可能的解决scheme来解决你的问题。

首先:创build一个子类:YouBaseTableView:UITableView,并在YouBaseTableView中添加一行。 并从YouBaseTableViewinheritance所有的表视图类。

第二:为UITableView创build一个扩展,并在这个扩展中写你的行。

你要进入两个不同的领域,需要充分理解才能正确使用,而且是非常危险的:在+ load方法中执行代码,并使用方法调整。 我永远不会在+负载中做任何事情。 如果你知道自己在做什么,+初始化是可以的,但如果你在这里提出问题,+加载是你甚至不能想到的东西。

现在问问自己:什么是“自我”,什么是“自我教学”? 你觉得这有什么工作的机会吗?

我也build议你谷歌的“swizzle”,并拿起一些其他代码的方法swizzling。 这对我来说很可疑。 而把它作为一个类而不是一个普通的C函数来感觉就太可怕了。

我可能迟到的火车…但是为了将来的参考,解决这个问题的方法是调整UITableView的setDataSource,并用NSProxy实例replace它。 通常没有人重写setDelegate / setDataSource方法,这将允许你调整这些方法并拦截所有对这些代表的调用并交换实现。

检查了解更多信息: https : //developer.apple.com/documentation/foundation/nsproxy