2017-08-08 59 views
4

如果我非常注意打印行,toVC中的所有內容都無法加載。 toVC的每個元素都是零。如果我離開印刷說明書,一切都按預期工作。爲什麼?如何打印語句刪除打破我的項目? (Swift/Xcode)

我在UITabBarControllerDelegateanimationControllerForTransitionFrom方法,如果這有所幫助。

我從來沒有這樣的事情發生過。只要我刪除該行,第一次觸及任何附有IBOutlet的元素時,該行就會中斷。任何幫助將不勝感激。

func animateToProfile(using transitionContext: UIViewControllerContextTransitioning) { 
    guard let fromVC = transitionContext.viewController(forKey: .from)?.childViewControllers.first, 
     let toVC = transitionContext.viewController(forKey: .to)?.childViewControllers.first as? ProfileViewController, 
     let superviewToAdd = toVC.parent?.view else { return } 

    print("\(toVC.view.frame)") 

    let sideMenuOriginX = UIScreen.main.bounds.width * (98/414) 

    toVC.sideMenuView.frame.origin.x = toVC.view.frame.width 
    toVC.visualEffectView.alpha = 0 

    transitionContext.containerView.addSubview(superviewToAdd) 

    let duration = transitionDuration(using: transitionContext) 

    UIView.animate(withDuration: duration, delay: 0, options: [.curveEaseInOut], animations: { 
     toVC.sideMenuView.frame.origin.x = sideMenuOriginX 
     toVC.visualEffectView.alpha = 1 
    }, completion: { _ in 
     transitionContext.completeTransition(!transitionContext.transitionWasCancelled) 
    }) 
} 
+0

如果將'print(「\(toVC.view.frame)」)'替換爲'_ = toVC.view',會發生什麼? – OOPer

+0

修復它。我認爲這是一個這樣的問題,但我從來沒有必須這樣做,過渡之前。爲什麼我必須在這裏? – Sethmr

+1

你可以嘗試'toVC.loadView()'。我並不擅長視圖控制器如何在轉換時進行管理,但在某些情況下,iOS在「loadView()」完成之前向我們傳遞了View Controller。第一次訪問'view'屬性隱式調用'loadView()',並觸發'viewDidLoad()',通常VC被設置。所以,當我發現類似於你的問題時,我嘗試'_ = vc.view'或'vc.loadView()'。 – OOPer

回答

0

啊。 UIViewControllers中的視圖通常由SDK在生命週期的相關部分進行延遲加載。這就是爲什麼你在viewDidLoad中設置代碼的原因,這個時候視圖已經被加載了。

因爲在打印語句中調用toVC.view時,它會延遲加載,導致它加載。

我懷疑這條線toVC.sideMenuView.frame.origin.x = toVC.view.frame.width可能是一個問題。當你設置一個視圖的屬性然後被覆蓋。

要嘗試進行調試,請嘗試進入該行。或者,您可以用簡單的_ = toVC.view替換print聲明來強制視圖加載。或者,在代碼中的各個位置添加一些print(toVC.isViewLoaded)的調試語句,以查看視圖是否實際加載。

+0

這是由視圖控制器造成的,我將不會在涉及其內部視圖的viewDidLoad中有任何代碼? – Sethmr

+0

取決於如何創建和添加內部視圖。 – Abizern