我有一个带有分段控制和两个子视图的控制器
@IBOutlet weak var firstContainerView: UIView!
@IBOutlet weak var secondContainerView: UIView!
@IBAction func segmentControlChanged(sender: AnyObject) {
if myController.selectedSegmentIndex == firstIndex {
self.view.sendSubview(toBack: secondContainerView)
}
else {
self.view.sendSubview(toBack: firstContainerView)
}
}
第一个子视图的视图控制器偶尔会在处理大任务时启动SVProgressHUD。如果我更改了观看次数,则可以隐藏或重新显示在viewWillAppear
/ viewWillDisappear
函数中
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if (isWaiting) {
SVProgressHUD.show()
...
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if (isWaiting) {
SVProgressHUD.dismiss()
}
}
但是,view.sendSubView(toBack: firstContainerView)
不会触发viewWillDisappear
。
是否存在SubView viewController可以接收的事件以通知其更改?
修改
经过大量搜索后,我找到了一种方法来获取包含子视图的viewController。在我的情况下,由于它包含一个以程序方式创建的UIPageViewContainer,因此相当复杂;但是我可以按照in this answer
获取当前页面的viewController所以我把它添加到最外面的视图控制器
override func prepare(for segue: UIStoryboardSegue, identifier: SegueIdentifier, sender: Any?) {
switch identifier {
case .PagingVCSegue:
if let pvc = segue.destination as? PagingVCContainer {
self.pagingViewContainer = pvc
}
default: break
}
}
这是分页容器
func getCurView() -> firstContainerView? {
if (pagingVC?.viewControllers?.count)! > 0 {
return pagingVC?.viewControllers![0] as? firstContainerView
}
return nil
}
然后能够在视图中调用方法来隐藏SVProgressHUD。
答案 0 :(得分:0)
事情是viewDidLoad,viewWillAppear等在VC上调用,而不是在视图上调用。 这就是为什么使用父视图控制器和子视图控制器更好的原因,因此您可以跟踪更改 https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html
答案 1 :(得分:0)
你不能不知道什么时候出现SVProgressHUD,因为你是那个说SVProgressHUD.show()
的人。同样,您不能不知道何时将视图发送到后面,因为您是self.view.sendSubview(toBack:)
。
因此,不需要任何“事件”或“通知”发生的事情。您知道正在发生什么,因为您正在这样做。如果您的视图中有一些您想要在此时调用的方法,请在此时调用它!
答案 2 :(得分:0)
首先我摆脱视图会出现并消失的东西。然后,我将实现以下类似的东西:
if selected == first
bringFirstToFront();
return
bringSecondToFront();
func bringFirstToFront(){
topTag = func getTopViewName() -> view.children[0].tag
topTag == "$first_tag_name"
//do nothing
return
//init views, start tasks... do w.e this view needs
}
...然后为bringSecondToFront();
执行大致相同的操作