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

时间:2015-04-23 06:17:50

标签: ios swift uibutton nsresponder

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

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

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

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

但我想拦截动作,执行一些代码并将其转发给控制器。但我找不到快速做到这一点的方法。在ObjC中,这个任务很容易做到,所以我觉得应该有一个快速的方法。

提前感谢您的帮助: - )

2 个答案:

答案 0 :(得分:3)

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

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

这将重新创建响应者链并将新消息中继到下一个响应者。

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

答案 1 :(得分:0)

我想在解除当前视图控制器后显示不同的视图控制器。该 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)
        }
    }
}