1
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) 
} 

啞視圖是添加到當前導航控制器視圖的uiview。 vc是要添加到導航控制器視圖的視圖控制器。 在vc viewcontroller中,調用了viewdidload。 但是viewdidappear和viewwillappear從未被稱爲。爲什麼呢?以及如何調用相同的。提前感謝viewdidappear在將子視圖添加到導航控制器時未調用

回答

2

根據Apple's documentation您添加視圖控制器和視圖的順序是正確的,但是,有時似乎有一個bug添加視圖控制器之前添加視圖(可能某種競爭條件)。

嘗試添加控制器作爲子視圖控制器

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

也許你可以也嘗試着換一個defer塊內的addChildViewController()方法之前,首先添加視圖。

相關問題