Ios 暂停父视图控制器的UIgestureRecognitor
我在我的应用程序中添加了一个弹出窗口,它覆盖在主父视图控制器上。但是当我在弹出窗口上滑动时,主视图控制器会识别滑动。在弹出窗口打开时,如何对子视图控制器的操作进行优先级排序或停止主视图控制器上的手势识别器 下面是我添加子视图的代码:Ios 暂停父视图控制器的UIgestureRecognitor,ios,swift,Ios,Swift,我在我的应用程序中添加了一个弹出窗口,它覆盖在主父视图控制器上。但是当我在弹出窗口上滑动时,主视图控制器会识别滑动。在弹出窗口打开时,如何对子视图控制器的操作进行优先级排序或停止主视图控制器上的手势识别器 下面是我添加子视图的代码: func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { selectedItem = self.menuItems[indexPath.row]
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)
}
谢谢你添加代码!看起来我们应该更改视图控制器的显示方式。首先,我将解释此代码不起作用的简单原因:当此方法返回时,
ratingVC
变量将被清除,并且由于它是对视图控制器的唯一引用,因此该视图控制器将从内存中清除。因此您的触摸无法发送到它:-)
有两种更好的方法可以显示视图控制器。您的代码正在执行所谓的“视图控制器包含”操作,除非您知道为什么要这样做,否则这可能是过火了
您可以做的第一件事是将显示的视图控制器设置为此表视图控制器上的强属性,然后使用presentViewController:animated:completion:
显示它。这很简单,苹果的图书馆负责将其视图显示在屏幕上
不过,现在推荐的方法是在点击表格视图单元后显示视图控制器的场景,如下所示:
作为旁注,代码中的
ratingVC.mainView=self
可能意味着另一种反模式。简单的建议是:确保mainView被标记为弱。更好的建议是使用松散耦合的设计模式,如委派、目标/操作或回调。尝试设置弹出视图属性。isExclusiveTouch==true
@LeoDabus我刚刚尝试过,一些操作仍然通过主视图控制器请显示如何显示“子”视图的代码。这里可能发生了其他事情,因为默认行为通常是“前面”的视图首先对触摸发表意见,除非其父视图明确决定不这样做。我不建议使用isExclusiveTouch,因为贪婪的视图似乎是你的问题,而不是你的解决方案。@ChrisTrahey我在添加子视图的地方添加了代码我之所以将视图原样放置,是因为我希望主视图控制器在后台可见。用这些其他方法可能吗?此外,我还确保mainView是一个弱变量,我只是用它将数据从ratingVC传递回main view控制器。我提到的其他表示方法有时也可以。您可以/应该为各种尺寸类别指定表示样式。看看这篇WWDC演讲:无论如何,如果你保持你的展示风格,你需要从你的源表VC中保留一个对你展示的视图控制器ratingVC的强烈引用