我想知道是否有一种方法可以向类的“实例”添加实例方法。
场景是我正在使用EKEventEditViewController,并且在这个类中有一个带有委托(UITableViewDelegate)的UITableView叫做“EKEventEditor”(非公共AFAIK)。它没有实现tableView:willDisplayCell:forRowAtIndexPath:方法,而我正试图使用该方法禁用一些单元格。
因此,我正在尝试向实例添加一个方法,但我在Obj-C运行时中找到的所有内容都是class_addMethod调用,它将方法添加到类而不是实例。由于“EKEventEditor”是私有的,我不能扩展它并自己添加该方法。
有什么提示吗?
这是我正在使用的代码,我尝试添加的函数(willDisplayCell_)没有被调用。
场景是我正在使用EKEventEditViewController,并且在这个类中有一个带有委托(UITableViewDelegate)的UITableView叫做“EKEventEditor”(非公共AFAIK)。它没有实现tableView:willDisplayCell:forRowAtIndexPath:方法,而我正试图使用该方法禁用一些单元格。
因此,我正在尝试向实例添加一个方法,但我在Obj-C运行时中找到的所有内容都是class_addMethod调用,它将方法添加到类而不是实例。由于“EKEventEditor”是私有的,我不能扩展它并自己添加该方法。
有什么提示吗?
这是我正在使用的代码,我尝试添加的函数(willDisplayCell_)没有被调用。
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if ([navigationController isKindOfClass:[EKEventEditViewController class]]) {
UITableViewController *rootController = (UITableViewController*)[(UINavigationController*)navigationController visibleViewController];
if ([rootController isKindOfClass:[UITableViewController class]]) {
UITableView *eventTableView = (UITableView*)[rootController view];
class_addMethod([eventTableView.delegate class],
@selector(tableView:willDisplayCell:forRowAtIndexPath:),
(IMP)willDisplayCell_, "v@:@@@");
}}}
void willDisplayCell_(id self, SEL cmd, UITableView *tableView, UITableViewCell *cell, NSIndexPath *indexPath) {
NSLog(@"CALLED?");
}
[<#委托类的名称#> tableView:willDisplayCell:forRowAtIndexPath:]
上设置断点来检查一下。如果它没有被发送,我不知道你能做什么(合理的情况下)。你可能需要将eventTableView
替换为自己的对象——这可能非常困难。但这可能值得另外发一个SO问题,我相信有人会有一两个想法。 - jscs