如何启用作为选项卡栏控制器索引的视图的用户交互

时间:2016-02-28 03:33:35

标签: swift uiviewcontroller uitabbarcontroller

我目前正在使用带有3个选项卡的标签栏控制器,我将其称为选项卡0,1和2.假设用户当前正在看到标签栏控制器中索引0处的视图控制器。当用户点击此视图上的按钮时,会发生两件事 1.启动一个任务,由一个单独的控制器类处理 2.我调用tabBarController.selectedIndex = 1将UI移动到我标签栏索引1中的视图控制器。

此时,在用户点击上一个视图中的按钮之后,我已经禁用了标签栏控制器中当前视图(索引1)的用户交互,方法是将其放在viewWillAppear()中。

然后,几秒钟后,启动的任务完成,并通过委托,我在viewController上收到当前处于视图中的回调(我的标签栏中的索引1)。此时收到回调时,我想为当前视图启用用户交互。

这是我的代码......

    func updateUIOnTaskCompletion(){

      self.loadView()
      self.view.userInteractionEnabled = true

      //I have also tried the following with no success
      //      self.tabBarController?.selectedViewController?.loadView()
      //      self.tabBarController?.selectedViewController?.loadView()

      //      self.tabBarController?.selectedViewController!.view.userInteractionEnabled = true
      //      self.tabBarController?.view.userInteractionEnabled = true

}

我致电loadView()的原因是因为没有调用此应用程序,应用程序因found nil while unwrapping an optional...而崩溃。由于view是可选的,因此调用loadView()会阻止值为nil,因此应用程序不会崩溃。但是,用户交互仍然永远不会启用。我也尝试了上面已经注释过的代码,没有成功。任何建议都会非常感谢,谢谢。

编辑:我在苹果文档中看到一个人永远不应该打电话给loadView(),所以必须有比我正在做的更好的方式,但这对我来说是不为人知的!

编辑:仅当我使用tabBarController?.selectedIndex = 1将UI移动到索引1中的视图时,我可以通过将self.view.userInteractionEnabled = false放在{{1}内来禁用此视图的用户交互}} 方法。但是,当我稍后在这个视图控制器上收到我的委托回调时,调用viewWillAppear()不起作用,也没有我尝试过的任何方法,如上所示。

1 个答案:

答案 0 :(得分:2)

不要在视图级别关闭用户交互,而是使用UIApplication beginIgnoringInteractionEventsendIgnoringInteractionEvents应用程序级别将其关闭。