respondsToSelector 在 UIButton 上为“setTitle:”返回 YES,但没有这样的选择器

Posted

技术标签:

【中文标题】respondsToSelector 在 UIButton 上为“setTitle:”返回 YES,但没有这样的选择器【英文标题】:respondsToSelector returns YES for "setTitle:" on UIButton but there is no such selector 【发布时间】:2015-04-27 12:34:23 【问题描述】:

我正在使用respondsToSelector:,而且大部分时间都可以正常工作。但是有一种情况我得到了错误的结果:

UIButton* button = [[UIButton alloc] init];
if([button respondsToSelector:NSSelectorFromString(@"setTitle:")]) // returns YES

    // try to call "setTitle:"

respondsToSelector: 返回 YES,但 UIButton 类中没有 setTitle: 选择器。有setTitle:forState:选择器,但这绝对不一样。

那么为什么respondsToSelector: 返回YES?

【问题讨论】:

响应选择器不只是检查公共接口,它会采用它可以找到的任何方法。这并不意味着您应该以这种方式使用它。你为什么用它? @Wain, Responds to selector doesn't just check the public interface 嗯,这就是答案......发布它,我会检查它是否正确。谢谢) 【参考方案1】:

响应选择器不只是检查公共接口,它会采用它可以找到的任何方法。我不记得UIButton 的早期 API 是否曾直接公开标题,但在内部它可能会随着状态的变化而被调用。

尝试仅将respondsToSelector: 用于您实际需要验证存在的 API,并注意通常有私有 API 稍后会公开,这也可能导致有趣的情况...

【讨论】:

【参考方案2】:

Alexandr,只有当你想检查一个对象是否实现了你要调用的方法时,你才应该使用这个“respondsToSelector”方法。而对于设置按钮标题,为什么你需要使用这个??

您应该使用此方法,通常您正在使用自定义委托方法..

【讨论】:

以上是关于respondsToSelector 在 UIButton 上为“setTitle:”返回 YES,但没有这样的选择器的主要内容,如果未能解决你的问题,请参考以下文章

respondsToSelector的使用

respondsToSelector 在 UIButton 上为“setTitle:”返回 YES,但没有这样的选择器

如何在 Swift 4 中使用 respondsToSelector 验证来自 HomeKit 的值的方法字节

respondsToSelector 发送到释放的对象

respondsToSelector和 instancesRespondToSelector的理解

Iphone,我该如何解决这个警告:'-respondsToSelector:' not found in protocol(s)