暂停父视图控制器的UIGestureRecognizer

时间:2017-02-07 23:38:11

标签: ios swift

我添加了一个弹出到我的应用程序,它放在主要的父视图控制器上。但是当我在弹出窗口上滑动时,主视图控制器正在识别滑动。如何在弹出窗口打开时为子视图控制器确定操作的优先级或在主视图控制器上停止手势识别器?

这是我添加子视图的代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    selectedItem = self.menuItems[indexPath.row]
    let ratingVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "rating") as! RatingView
    ratingVC.mainView = self
    ratingVC.foodName = selectedItem
    self.addChildViewController(ratingVC)
    ratingVC.view.frame = self.view.frame
    self.view.addSubview(ratingVC.view)
    ratingVC.didMove(toParentViewController: self)
}

1 个答案:

答案 0 :(得分:0)

感谢您添加代码!看起来我们应该改变我们呈现View Controller的方式。首先,我将解释此代码不起作用的简单原因:当此方法返回时,ratingVC变量被清除,并且因为它是对View Controller的唯一引用,所以View Controller从内存中清除。所以你的触摸无法发送到它: - )

有几种更好的方式来呈现视图控制器。您的代码正在执行所谓的“View Controller Containment”,除非您知道为什么要这样做,否则它可能会过度。

您可以做的第一件事是将呈现的视图控制器设置为此表视图控制器上的强属性,然后使用presentViewController:animated:completion:来呈现它。这很简单,Apple的库可以处理它在屏幕上的视图。

现在推荐的方式是在点击表格视图单元格后呈现View Controller的场景,如下所示:

  1. 使用Storyboard设置表格视图(包含原型单元格)和目标场景。
  2. Ctrl-从单元格原型拖动到目标场景。
  3. 在表视图控制器的代码中,使用prepareForSegue:sender:为目标View Controller提供所需的状态。
  4. 作为旁注,代码中的ratingVC.mainView = self可能意味着另一种反模式。简单的建议是:确保将mainView标记为弱。更好的建议是使用松散耦合设计模式,如委托,目标/操作或回调。