클래스의 "인스턴스"에 인스턴스 메소드를 추가하는 방법이 있는지 궁금합니다.런타임에 objective-c 클래스의 인스턴스에 메소드 추가하기
시나리오는 내가 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_, "[email protected]:@@@");
}}}
void willDisplayCell_(id self, SEL cmd, UITableView *tableView, UITableViewCell *cell, NSIndexPath *indexPath) {
NSLog(@"CALLED?");
}
당신은 할 수 KVO가 개별 객체의 접근자를 동적으로 덮어 쓰는 데 사용하는 것과 동일한 하위 클래스 및 속임수를 사용하여 특정 인스턴스에 메소드를 추가합니다. – Chuck
@ Chuck : 오, 그래! 날 따라와. –
@JoshCaswell 나는 내 코드로 질문을 편집했다. 나는 willDisplayCell_이 호출되지 않는다고 잘못된 것을하고 있는가? – Herman