是否可以从 iOS 中的另一个函数调用块完成处理程序?
Is it possible to call a block completion handler from another function in iOS?
我有一个带有 UITapGestureRecognizer 的自定义 UIView。手势识别器调用一个名为 hide() 的方法来从父视图中删除视图:
func hide(sender:UITapGestureRecognizer){
if let customView = sender.view as? UICustomView{
customView.removeFromSuperview()
}
}
UICustomView 也有一个 show() 方法,可以将它添加为子视图,例如:
func show(){
// Get the top view controller
let rootViewController: UIViewController = UIApplication.sharedApplication().windows[0].rootViewController!!
// Add self to it as a subview
rootViewController.view.addSubview(self)
}
这意味着我可以创建一个 UICustomView 并将其显示为:
let testView = UICustomView(frame:frame)
testView.show() // The view appears on the screen as it should and disappears when tapped
现在,我想将我的 show() 方法变成一个带有完成块的方法,该块在触发 hide() 函数时调用。类似于:
testView.show(){ success in
println(success) // The view has been hidden
}
但要这样做,我必须从我的 hide() 方法调用 show() 方法的完成处理程序。
这是可能的还是我忽略了什么?
由于您正在实施 UICustomView
,您需要做的就是将 'completion handler' 存储为 UICustomView
class 的一部分。然后在调用 hide()
时调用处理程序。
class UICustomView : UIView {
var onHide: ((Bool) -> ())?
func show (onHide: (Bool) -> ()) {
self.onHide = onHide
let rootViewController: UIViewController = ...
rootViewController.view.addSubview(self)
}
func hide (sender:UITapGestureRecognizer){
if let customView = sender.view as? UICustomView{
customView.removeFromSuperview()
customView.onHide?(true)
}
}
当然,每个UIView
都有一个生命周期:viewDidAppear
、viewDidDisappear
等。因为你的UICustomView
是[=的子class 15=] 你可以覆盖生命周期方法之一:
class UICustomView : UIView {
// ...
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear (animated)
onHide?(true)
}
}
如果视图可能消失,您可能会考虑第二种方法 w/o 对 hide()
的调用,但您仍然希望 onHide
到 运行。
我有一个带有 UITapGestureRecognizer 的自定义 UIView。手势识别器调用一个名为 hide() 的方法来从父视图中删除视图:
func hide(sender:UITapGestureRecognizer){
if let customView = sender.view as? UICustomView{
customView.removeFromSuperview()
}
}
UICustomView 也有一个 show() 方法,可以将它添加为子视图,例如:
func show(){
// Get the top view controller
let rootViewController: UIViewController = UIApplication.sharedApplication().windows[0].rootViewController!!
// Add self to it as a subview
rootViewController.view.addSubview(self)
}
这意味着我可以创建一个 UICustomView 并将其显示为:
let testView = UICustomView(frame:frame)
testView.show() // The view appears on the screen as it should and disappears when tapped
现在,我想将我的 show() 方法变成一个带有完成块的方法,该块在触发 hide() 函数时调用。类似于:
testView.show(){ success in
println(success) // The view has been hidden
}
但要这样做,我必须从我的 hide() 方法调用 show() 方法的完成处理程序。 这是可能的还是我忽略了什么?
由于您正在实施 UICustomView
,您需要做的就是将 'completion handler' 存储为 UICustomView
class 的一部分。然后在调用 hide()
时调用处理程序。
class UICustomView : UIView {
var onHide: ((Bool) -> ())?
func show (onHide: (Bool) -> ()) {
self.onHide = onHide
let rootViewController: UIViewController = ...
rootViewController.view.addSubview(self)
}
func hide (sender:UITapGestureRecognizer){
if let customView = sender.view as? UICustomView{
customView.removeFromSuperview()
customView.onHide?(true)
}
}
当然,每个UIView
都有一个生命周期:viewDidAppear
、viewDidDisappear
等。因为你的UICustomView
是[=的子class 15=] 你可以覆盖生命周期方法之一:
class UICustomView : UIView {
// ...
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear (animated)
onHide?(true)
}
}
如果视图可能消失,您可能会考虑第二种方法 w/o 对 hide()
的调用,但您仍然希望 onHide
到 运行。