【发布时间】:2018-06-09 18:05:15
【问题描述】:
我正在尝试从 UIView 类上的 UIGestureRecognizer 向其父视图控制器发送操作。
HomeViewController 包含一个包含几个 (5) OperationViews 的视图。
OperationView 扩展了 UIView,看起来像这样:
class OperationView: UIView {
override func awakeFromNib() {
super.awakeFromNib()
// OperationView is on a view that has HomeViewController as it's controller in StoryBoard
let swipeGestureRecognizer = UISwipeGestureRecognizer(target: HomeViewController.self(), action: #selector(HomeViewController.operatorWasSwiped(_:)))
swipeGestureRecognizer.direction = .left
let tapGestureRecognizer = UITapGestureRecognizer(target: HomeViewController.self(), action: #selector(HomeViewController.operatorWasSwiped(_:)))
self.addGestureRecognizer(swipeGestureRecognizer)
self.addGestureRecognizer(tapGestureRecognizer)
}
在 HomeViewController 我有这个应该由 UIGestureRecognizers 调用的函数:
@objc func operatorWasSwiped(_ sender : UIGestureRecognizer) {
if (sender.isKind(of: UITapGestureRecognizer.self)) { print("Tapped") }
else { print("Swiped") }
self.performSegue(withIdentifier: "segue1", sender: nil)
}
但是,我什么也没得到。甚至没有错误。
我尝试使用 HomeViewController 上的 IBOutlet 将 UIGestureRecognizer 添加到每个 OperationView:
view1.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view2.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view3.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view4.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view5.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view1.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view2.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view3.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view4.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view5.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view1.addGestureRecognizer(view1.swipeGestureRecognizer!)
view2.addGestureRecognizer(view2.swipeGestureRecognizer!)
view3.addGestureRecognizer(view3.swipeGestureRecognizer!)
view4.addGestureRecognizer(view4.swipeGestureRecognizer!)
view.addGestureRecognizer(view5.swipeGestureRecognizer!)
view1.addGestureRecognizer(view1.tapGestureRecognizer!)
view2.addGestureRecognizer(view2.tapGestureRecognizer!)
view3.addGestureRecognizer(view3.tapGestureRecognizer!)
view4.addGestureRecognizer(view4.tapGestureRecognizer!)
view5.addGestureRecognizer(view5.tapGestureRecognizer!)
我添加的地方:
var swipeGestureRecognizer: UISwipeGestureRecognizer?
var tapGestureRecognizer: UITapGestureRecognizer?
为 OperationView 分类变量
这行得通,但它远非优雅(想象一下,如果我必须添加另一个视图......有点违背了我之前的抽象观点)
有什么想法吗?还是我错过了什么?
我正在使用 Swift 4 和 Xcode 9
【问题讨论】:
-
您需要将对现有的
HomeViewController实例的引用传递给您的手势目标。您的目标当前是一次性实例。 -
我该怎么做? ViewControllers 很容易知道它们处理什么视图,但是就 MVC 而言,视图通常不知道哪个 ViewController 处理它们。你会建议什么方法?
标签: ios swift uitapgesturerecognizer