objective-c - forwardingTargetForSelector : work? 怎么办

标签 objective-c uibarbuttonitem message-forwarding

我有一个 UIBarButtonItem .当它收到无法处理的消息时,我希望它将该消息转发到特定的 View Controller 。

我想我可以使用条形按钮项的 forwardingTargetForSelector: 来完成此操作方法,但显然在 UIBarButtonItem 类型的对象上找不到此类属性. (术语点:这是否意味着 forwardingTargetForSelector: 是私有(private)属性?编辑:等等,我想我很困惑......最后带有冒号的方法不是属性......所以你能公开一个传递参数的方法(如 getter/setter)?)

这是否意味着为了设置 forwardingTargetForSelector: 的值我必须从要设置它的对象的 .m 文件中执行此操作吗?这意味着我必须继承我的 UIBarButtonItem?

如果是这样,为什么这不是 NSObjects 的公共(public)属性?

此外,实现我的转发目标的最佳方法是什么,最好避免子类化?

附加信息:

这一切都源于我倾向于重复使用单个 Action 来响应按下相同按钮的各种实例。该操作当前包含在我的委托(delegate)中(请参阅 How should I implement [almost] identical actions used throughout various VCs? (Answer: use a category) ),只是它应该向 View Controller 发送一个 presentViewController 消息,该 View Controller 实例化了发送该操作的按钮。因此,在操作中,我可以向 sender 发送 presentViewController 消息。 ,这是按钮的一个实例,我希望能够将该消息转发到创建该按钮实例的 View Controller ,如果我在每个按钮在其各自实例化后立即设置它的转发属性,我可以做到这一点 View Controller 。

我希望避免“为什么”只是为了让问题更短,但是你去吧。

最佳答案

forwardingTargetForSelector:不是真正的属性(property);这更像是当实例未响应消息时运行时询问实例的问题。

它不能是 @property 中的属性/感觉,因为每个选择器可能有不同的目标;它背后需要一个映射。这不是声明的属性的工作方式。
UIBarButtonItem来自NSObject ,并且它与所有其他方法一起继承了此方法,但是您不能从实异常(exception)部“设置”选择器的转发目标(无论如何,无需创建一些其他机制来允许您这样做 - 可能,但不是默认可用)。

为了使用这个方法,是的,你必须在进行转发的类中实现它。这确实意味着子类化。这也意味着转发实例需要对它所转发的对象有一个引用;这需要精心设计。
forwardingTargetForSelector:几乎肯定不是实现任何目标的正确方法。总的来说,事实上,它有点深奥。

我不确定您到底要解决什么问题(“使按钮转发它不响应的消息”仍然很笼统-特别是,为什么有必要这样做?),因此很难做到精确的。

关于objective-c - forwardingTargetForSelector : work? 怎么办,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16556761/

相关文章:

objective-c - 我怎样才能通过消息转发将 "swallow"发送到 "unrecognized selector error"?

c# - 如何将 HttpRequestMessage 转发到另一台服务器

ios - 如何读取 plist 文件然后填充 UItableView?

ios - 使用 ABNewPersonViewController 查看 iOS 11 中的白色标题和导航栏

ios - 平移平移手势坐标

ios - UIBarButtonItem setBackButtonTitlePositionAdjustment 不起作用

iOS 8 - UIBarButtonItem 推送 Segue 覆盖操作

ios - 只有在第一个功能完成后才执行一个功能 - ios

objective-c - 如何获取从 UIBarButtonItem 到包含的 navigationController 的引用?

objective-c - Swallow 无法识别来自 NSInspiration 前向调用调用的选择器异常