gpt4 book ai didi

objective-c - 在运行时向 objective-c 类的实例添加方法

转载 作者:太空狗 更新时间:2023-10-30 04:01:13 25 4
gpt4 key购买 nike

我想知道是否有办法将实例方法添加到类的“实例”中。

场景是我正在使用 EKEventEditViewController 并且此类中有一个 UITableView,其中有一个名为“EKEventEditor”(非公共(public) AFAIK)的委托(delegate)(UITableViewDelegate)。它没有实现 tableView:willDisplayCell:forRowAtIndexPath: 方法,我试图用它来禁用某些单元格。

所以我试图向实例添加一个方法,但我在 Obj-C 运行时中只能找到 class_addMethod 调用,它向类而不是实例添加方法。由于“EKEventEditor”是私有(private)的,我不能只扩展它并自己添加该方法。

有什么提示吗?

这是我正在使用的代码,我尝试添加的函数 (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?");
}

最佳答案

这就是您想要的功能。这会将(实例)方法添加到该类的所有实例。*无法只向一个特定实例添加方法。**

您可能想研究使用 Category ,但是,确实让您扩展一个您无法控制其 @implementation 的类。不过,这只有在您可以导入该类的主要 @interface 时才有效,而且听起来可能并非如此。


*如果你想添加一个类方法,你将以元类作为第一个参数调用函数。

** 除非我正在处理覆盖 forwardInvocation: 和可能的 libffi 的一些技巧。

关于objective-c - 在运行时向 objective-c 类的实例添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com