2015-09-19 37 views
16

我試圖解決一個視圖的位置錯誤已出現的iOS 9我從xib文件(非自動佈局)實例化視圖控制器,然後把它推到我的UINavigationControlleriOS 9:框架不再設置viewWillAppear後UINavigationController pushViewController

問題是,當調用視圖控制器的viewWillAppear方法時,其框架尚未調整爲導航控制器的大小,並且仍然是在xib文件中設置的。它現在不能正確設置,直到viewDidAppear

這完全搞砸了我的代碼。有誰知道究竟是什麼導致了這個變化,以及處理它的最好方法是什麼?我不想等到viewDidAppear,因爲這看起來很糟糕,並會導致糟糕的用戶體驗。

+1

我遇到了同樣的問題。經進一步檢查,它看起來像孩子的看法都沒有,甚至被添加到的UINavigationController的觀點,但(view.superview ==無) –

回答

11

我也在尋找最佳解決方案。

我暫時一個是調用,這是在「viewDidAppear」在「viewDidLayoutSubviews」的代碼。這樣,一旦幀被設置,我的代碼就會被調用。

但是,一定要添加一個布爾值或東西,使你的代碼不會被調用每一個viewDidLayoutSubviews被稱爲

-(void)viewDidLayoutSubviews{ 
    if (didLayoutSubviews == NO){ 
     didLayoutSubviews = YES; 
     // perform code that was in viewWillAppear 
    } 
} 
+0

感謝尼克,這並獲得成功!不幸的是,這是必要的。 'viewWillAppear'是以前放這個代碼的完美概念。現在感覺就像我們做一個黑客做自然面前什麼來。 :( – devios1

0

我發生這個問題太費時間,

嘗試取消選擇「從NIB調整大小視圖「從故事板

0

嘗試將佈局代碼從viewWillAppear移動到viewWillLayoutSubviews

0

一點點更新NickProvost的回答是:

private var loadViewToken: dispatch_once_t = 0 

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    dispatch_once(&loadViewToken) { [weak self] in 
     if let wSelf = self { 
      wSelf.setupView() 
     } 
    } 
} 
相關問題