【问题标题】:How to call a delegate's function without getting the "instance method not found" warning in ios?如何调用委托的函数而不在 ios 中收到“未找到实例方法”警告?
【发布时间】:2012-01-13 21:37:42
【问题描述】:

在我开发的应用程序中,我经常发现这样的代码行

[委托一个函数];

生成“未找到实例方法“aFunction”(返回类型默认为 id)”警告

现在,我对 SO 进行了一些研究,发现可以通过在 self ([self aFunction];) 上调用它时声明函数来删除警告,但没有一个答案说明我的情况,当我使用委托时。

那么,长话短说,我该怎么做才能在另一个类中正确调用委托的方法? 一切似乎都很好,所以这不是一个主要问题,但警告意味着我没有做完全正确的事情,所以我想了解这种情况下的最佳做法是什么

提前感谢您的帮助!

【问题讨论】:

  • 嘿伙计。在下面提供了第二个答案。

标签: objective-c ios delegates


【解决方案1】:

因此,如果我对您的理解正确,可以通过如下声明您的协议来解决您的问题:

@class SomeClass;
@protocol SomeClassDelegate <NSObject>
@required
- (void)thisObjectDidSomething:(SomeClass*)instance;
@optional
- (void)thisObjectDidSomethingUnimportant:(SomeClass*)instance;
@end

然后您的委托 ivar 和属性如下所示(如果您不使用 ARC,请使用 assign 而不是 weak):

@interface SomeClass () {
    __weak id<SomeClassDelegate> delegate_;
}
@property (weak) id<SomeClassDelegate> delegate;

在任何要实现该协议的类的 .h 文件中,执行以下操作:

@interface TCReader : NSObject <SomeClassDelegate> {

}

由于在 nil 上调用选择器是安全的,对于所需的方法,您可以:

[self.delegate thisObjectDidSomething:self]

但是对于可选方法,你最好:

if ([self.delegate respondsToSelector:@selector(thisObjectDidSomethingUnimportant:)]) {
    [self.delegate thisObjectDidSomethingUnimportant:self]
}

这里的要点是,通过声明和使用协议,您可以让 XCode 知道这些方法是为实现该协议的对象定义的。如果你要求你的委托实现那个协议,那么 Xcode 就知道你的委托已经定义了这些方法。

【讨论】:

  • 哇,这是一个很好的答案,它解释了很多!我会尝试实现它,看看它是否有效
  • 请注意,如果您已完成所有这些操作,并且您正在将委托作为另一个类的属性访问,并且您仍然收到此警告,那么您可能只需要在引用它的类中导入定义委托的标头。 (例如#import "SomeClassDelegate.h"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2023-04-06
  • 1970-01-01
  • 2016-07-16
  • 2013-08-13
相关资源
最近更新 更多