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)
}
}
}
我在 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)
}
}
}