【问题标题】:Is there an event to notify view controller that the view has been sent to back是否有事件通知视图控制器视图已被发送回
【发布时间】:2017-07-22 11:38:03
【问题描述】:

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

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

编辑

经过大量搜索,我找到了一种方法来获取包含子视图in this answer 的视图控制器。就我而言,它包含一个以编程方式创建的 UIPageViewContainer ,这一事实相当复杂。但是我可以通过this tutorial获得当前页面的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。

【问题讨论】:

    标签: swift uiview uiviewcontroller


    【解决方案1】:

    问题是 viewDidLoad、viewWillAppear 等是在 VC 上调用的,而不是在视图上调用的。 这就是为什么最好使用父视图控制器和子视图控制器,这样您就可以跟踪更改 https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

    【讨论】:

      【解决方案2】:

      您无法知道 SVProgressHUD 何时出现,因为 是在说SVProgressHUD.show() 的人。同样,您无法知道视图何时被发送到后面,因为 是在说self.view.sendSubview(toBack:)

      因此,没有必要对正在发生的事情进行任何“事件”或“通知”。你知道正在发生什么,因为你正在这样做。如果此时你想调用视图中的某个方法,请在此时调用它!

      【讨论】:

      • 好的,所以也许我不明白你的回答。显示和关闭与 sendToBack 位于不同的视图控制器上,并且超级视图控制器仅引用子视图,而不是它们的视图控制器。所以问题是如何在子视图控制器中调用方法
      【解决方案3】:

      首先我要摆脱视图会出现和消失的东西。然后我会实现与以下类似的东西:

      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() 执行相同的操作;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-02
        • 1970-01-01
        • 2018-08-06
        相关资源
        最近更新 更多