Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在presentingViewController中处理点击事件以关闭侧菜单_Ios_Uitableview_Swift2_Uitapgesturerecognizer - Fatal编程技术网

Ios 在presentingViewController中处理点击事件以关闭侧菜单

Ios 在presentingViewController中处理点击事件以关闭侧菜单,ios,uitableview,swift2,uitapgesturerecognizer,Ios,Uitableview,Swift2,Uitapgesturerecognizer,我用这个来展示一个配菜。我只需点击菜单外的任何地方就可以取消菜单 我所尝试的: 1) 处理viewController上的点击事件(负责显示菜单) 结果:仅当菜单关闭时触发点击事件,菜单打开后不再触发点击事件 2) 在菜单控制器上处理点击事件 结果:只接收菜单中的点击事件 3) 使用presentingViewController 结果:未收到事件 以下是菜单viewcontroller中的代码: private var tapGesture: UITapGestureRecognizer? =

我用这个来展示一个配菜。我只需点击菜单外的任何地方就可以取消菜单

我所尝试的:

1) 处理viewController上的点击事件(负责显示菜单)

结果:仅当菜单关闭时触发点击事件,菜单打开后不再触发点击事件

2) 在菜单控制器上处理点击事件

结果:只接收菜单中的点击事件

3) 使用
presentingViewController

结果:未收到事件

以下是
菜单viewcontroller
中的代码:

private var tapGesture: UITapGestureRecognizer? = nil

override func viewDidLoad() {
    super.viewDidLoad()

    if let viewController = self.presentingViewController as? ViewController {
        tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
        viewController.container.addGestureRecognizer(tapGesture!)
    } 
}

func handleTap(recognizer: UITapGestureRecognizer){
    let location = recognizer.locationInView(view)
    print("menu \(location)")
}
我真的很累。无法确定如何在显示菜单后接收菜单外的点击事件

注意:我正在使用

编辑:

通过将点击识别器连接到按键窗口,我能够接收菜单外的点击事件:

        tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
          UIApplication.sharedApplication().keyWindow?.addGestureRecognizer(tapGesture!)
但是现在作为
UITableViewController
的菜单无法响应点击事件
willSelectRowAtIndexPath
didSelectRowAtIndexPath

编辑2:


通过实现
UIgestureRecognitizerDelegate的委托方法,我能够解决TableView上的块触摸事件问题:

  func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {

    let location = touch.locationInView(view)
    if !CGRectContainsPoint(self.tableView.frame, location){
        delegate?.menuDidCancel(self)
    }
    return false
}

问题解决了,但这是其他优雅的解决方案中最好的吗?

通过实现
uigestureRecognitizerDelegate
的委托方法,我能够解决TableView上的块触摸事件问题,并在用户点击外部时关闭菜单后返回false

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {

        let location = touch.locationInView(view)
        if !CGRectContainsPoint(self.tableView.frame, location){
            delegate?.menuDidCancel(self)
        }
        return false
    }