【问题标题】:viewdidappear not called when adding subview to navigation controller将子视图添加到导航控制器时未调用 viewdidappear
【发布时间】:2017-12-23 10:35:24
【问题描述】:
func showCustomViewController(vc : UIViewController,dummy : UIView,fromView1:UIViewController){
    datePickerShown = true
    let fromView = fromView1.navigationController?.view
    var navTopConstraint : NSLayoutConstraint!
    vc.view.translatesAutoresizingMaskIntoConstraints=false

    self.navigationController?.addChildViewController(vc)
    dummy.addSubview(vc.view)
    vc.didMove(toParentViewController: self.navigationController)

    dummy.addConstraint(NSLayoutConstraint(item: vc.view, attribute: .top, relatedBy: .equal, toItem: dummy, attribute: .top, multiplier: 1, constant: 0))
    dummy.addConstraint(NSLayoutConstraint(item: vc.view, attribute: .left, relatedBy: .equal, toItem: dummy, attribute: .left, multiplier: 1, constant: 0))
    dummy.addConstraint(NSLayoutConstraint(item: vc.view, attribute: .width, relatedBy: .equal, toItem: dummy, attribute: .width, multiplier: 1, constant: 0))
    dummy.addConstraint(NSLayoutConstraint(item: vc.view, attribute: .height, relatedBy: .equal, toItem: dummy, attribute: .height, multiplier: 1, constant: 0))
    dummy.backgroundColor=UIColor.clear

    if dummy.superview == nil{
        fromView?.addSubview(dummy)
    }

    for constraints in dummy.constraints{
        if constraints.firstAttribute == .top{
            navTopConstraint = constraints
        }
    }

    fromView?.addConstraint(NSLayoutConstraint(item: dummy, attribute: .width, relatedBy: .equal, toItem: fromView, attribute: .width, multiplier: 1, constant:0 ))
    fromView?.addConstraint(NSLayoutConstraint(item: dummy, attribute: .top, relatedBy: .equal, toItem: fromView, attribute: .top, multiplier: 1, constant: -60))
    fromView?.addConstraint(NSLayoutConstraint(item: dummy, attribute: .bottom, relatedBy: .equal, toItem: fromView, attribute: .bottom, multiplier: 1, constant: 0))
    fromView?.addConstraint(NSLayoutConstraint(item: dummy, attribute: .left, relatedBy: .equal, toItem: fromView, attribute: .left, multiplier: 1, constant: 0))

    navTopConstraint.constant = (fromView?.frame.maxY)!
    fromView?.layoutIfNeeded()

    UIView.animate(withDuration: 0.33, delay: 0, options:.curveEaseInOut, animations: {
        dummy.backgroundColor=UIColor.init(white: 0.0, alpha: 0.4)
        navTopConstraint.constant=0
        fromView?.layoutIfNeeded()
    }, completion: nil)
}

dummy view 是添加到当前导航控制器视图的 uiview。 vc 是要添加到导航控制器视图的视图控制器。 在 vc viewcontroller 中,调用了 viewdidload。 但是 viewdidappear 和 viewwillappear 从来没有被调用过。为什么会这样呢?以及如何调用相同的。在此先感谢

【问题讨论】:

    标签: ios swift3 uiviewcontroller uinavigationcontroller viewwillappear


    【解决方案1】:

    根据Apple's documentation,您添加视图控制器和视图的顺序是正确的,但是,有时在添加视图之前添加视图控制器时似乎会出现错误(可能是某种竞争条件)。

    在将控制器添加为子视图控制器之前先尝试添加视图

    dummy.addSubview(vc.view)
    self.navigationController?.addChildViewController(vc)
    

    您也可以尝试将 addChildViewController() 方法包装在 defer 块中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2020-07-31
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多