是否存在通知视图控制器已将视图发送回的事件

时间:2017-03-02 16:21:42

标签: swift uiview uiviewcontroller

我有一个带有分段控制和两个子视图的控制器

@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可以接收的事件以通知其更改?

修改

经过大量搜索后,我找到了一种方法来获取包含子视图enter image description here的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。

3 个答案:

答案 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();

执行大致相同的操作