Swift 中的响应链(UIButton 目标中为 nil 目标)

Responder Chain in Swift (nil target in UIButton target)

我在 swift 中使用响应链时遇到问题。

当我使用 nil 目标设置按钮目标时,例如:

someButton.addTarget(nil, action:"addButtonTapped:", forControlEvents: .TouchUpInside)

动作将被发送到响应者链,直到动作在控制器中被处理。到目前为止一切顺利:-)

但我想拦截动作,执行一些代码并将其转发给控制器。但我无法在 swift 中找到执行此操作的方法。在 ObjC 中,这个任务很容易做到,所以我想 swift 中也应该有一种方法。

在此先感谢您的帮助:-)

我的一位同事提示我重新创建选择器并再次手动发送它。

let selector = Selector("someButtonTapped:")
let target: AnyObject? = self.nextResponder()?.targetForAction(selector, withSender: button)
UIApplication.sharedApplication().sendAction(selector, to: target, from: self, forEvent: nil)

这将重新创建响应者链并将新消息转发给下一个响应者。

我希望有人会觉得这很有用。

我想在关闭当前视图控制器后显示一个不同的视图控制器。这 MyContainerViewController 容器视图控制器具有打开不同视图控制器的功能。在关闭当前视图控制器后使用响应链呈现不同的视图控制器,避免了必须保留引用或强制转换父视图控制器。这个特别方便 当使用大量嵌套的子视图控制器和容器视图控制器时。

class SomeChildViewController: UIViewController {
    @IBAction func closeAndShowSomething(sender: Any?) {}
        let showSelector = #selector(MyContainerViewController.showSomething(_:))
        let viewController: Any? = next?.target(forAction: showSelector, withSender: nil)
        dismiss(animated: true) {
            UIApplication.shared.sendAction(showSelector, to: viewController, from: self, for: nil)
        }
    }
}