我目前正在使用带有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()
不起作用,也没有我尝试过的任何方法,如上所示。
答案 0 :(得分:2)
不要在视图级别关闭用户交互,而是使用UIApplication beginIgnoringInteractionEvents
和endIgnoringInteractionEvents
在应用程序级别将其关闭。