クラスの「インスタンス」にインスタンス メソッドを追加する方法があるかどうか疑問に思っています。
シナリオは、私がEKEventEditViewControllerを使用しており、このクラス内に「EKEventEditor」(非公開AFAIK)と呼ばれるデリゲート(UITableViewDelegate)を持つUITableViewがあるということです。一部のセルを無効にするために使用しようとしている 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?");
}