我如何获得代表的那种课程?
我想打电话给self.delegate.class
,但它不存在。
我的目标是调用两种不同的方法,具体取决于哪个类是发起具有协议的类的人。
答案 0 :(得分:1)
您可以(并且应该)使用 respondsToSelector 来检查该委托是否能够响应该选择器,而不是试图弄清楚该类。
示例:
if ([self.delegate respondsToSelector:@selector(method1:)]) {
[self.delegate method1:self];
} else if ([self.delegate respondsToSelector:@selector(method2:)]) {
[self.delegate method2:self];
}
并且您只在所需的类中实现每个方法,但它们都在委托协议上。这种方法是否符合您的需求?
像其他人一样评论和回答,无论谁调用委托人都不需要知道他是什么类或类型,只需要检查该委托是否符合协议,以及是否响应你要调用他的方法。 / p>
有关respondsToSelector @ Apple Documentation
的更多信息答案 1 :(得分:0)
使用委托协议的重点是将执行工作的对象与作用于完成工作的类的类型分离。
事实上,代表的本质是你不会关心它是什么类。所有你关心的是它符合协议,因此将有一组可以在其上运行的已知函数。
代理可以是UIView
,UIViewController
,UILabel
或您希望的任何自定义类。
通过检测类,然后根据类不同地对它进行操作,你违反了委托和协议首先试图绕过紧密耦合对象的基本原则。
此外,具有代表的班级不应该知道数据发生了什么,也不应该关心。例如,UITableView
并不知道当其委托响应所选单元格时会发生什么。该委托可以更新CoreData中的内容或转换到新的ViewController。表格视图不会(并且不应该)知道这一点。
你的对象应该说...... HELLO DELEGATE! Something just happened and this is the result, just wanted to let you know
。然后代表接受该结果并对其采取行动。
答案 2 :(得分:0)
我知道这个问题很旧,但是如果有人在寻找一种方法来解决这个问题,这就是方法。
除了您不应该耦合到其他答案中准确说明的委托类型(这是模式的整个目的)这一事实之外,我还面临着相同的要求,并且我认为问题没有得到答案正确地。 我正在用更新的版本替换视图控制器,并且由于调试原因,我需要两个视图控制器同时起作用。由于我正在开发一项功能,因此我需要更改一种将破坏旧方法的对象方法实现,并且设法解决了这一问题:
[(NSObject*)_delegate isKindOfClass:[YourType class]];
因此,基本上将delegate
强制转换为NSObject可以访问类选择器,然后您可以根据委托人的类型进行决策。这样,我可以保留旧的实现以与旧的视图控制器一起使用,并且还可以在else
类型为{{的情况下执行的delegate
子句中添加新的实现。 1}}。
答案 3 :(得分:-1)
对于您的问题:致电[delegate class]
现在你有了这个类委托。
注意:如果您的代表为零,[delegate class]
没有回应。
注意2:检查调试语句以查看委托类。你也可以把一个调试语句检查看是委托nil吗?