[英]UIViewController -viewDidLoad not being called
作為 Cocoa 的新手,我在使用Interface Builder
、 UIViewController
和朋友時遇到了一些問題。
我有一個UIViewController
子類,在 xib 中定義了一個UIView
,並且控制器的視圖出口連接到視圖。 xib 的“文件所有者”被設置為myViewcontroller子類。
在這種情況下,以下用於加載控制器/視圖(從主視圖控制器)的代碼無法按預期工作:
if ( self.myViewController == nil )
{
self.myViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:nil];
}
[self.navigationController
pushViewController:self.myViewController animated:YES];
在 MyViewController 的方法中,我放置了斷點和日志消息來查看發生了什么:
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
NSLog(@"initWithNibName\n");
}
return self;
}
-(void)viewDidLoad {
[super viewDidLoad];
NSLog(@"viewDidLoad\n");
}
預期結果
無論-initWithNibName
和-viewDidLoad
方法被調用,並顯示myViewController的觀點。
觀察結果
僅調用-initWithNibName
,不顯示視圖。
我錯過了什么嗎? 任何人都可以推薦任何檢查嗎? (特別是在非常不透明的 Interface Builder 工具中)。
回復:找到解決方案!!!!!
確實,這似乎是一個view.hidden
解決方案,但是真正的技巧不是將view.hidden
屬性設置為 NO,從 nib 文件加載視圖的原因是調用UIViewController's
視圖方法,視圖實際上只從第一次調用視圖方法時的筆尖。
從這個意義上說,一個簡單的[viewController view]
消息將強制視圖從 nib 文件加載。
好的,我有一個部分的答案 - 也許大師可以解釋更多。 問題是:
[self.navigationController pushViewController:myViewController animated:YES];
仔細觀察,在這種情況下self.navigationController
為零 - 因此推送消息無處可去。
相反,如果我發送:
[self.view addSubview:self.myViewController.view];
然后視圖出現並-viewDidLoad
。
我不完全確定為什么在這個實例中沒有設置self.navigationController
- 我唯一能想到的是self
是UIViewController
的子類而不是UITableViewController
( pushViewController
代碼來自哪里)。
此外,默默地允許消息為零似乎是一個壞主意,盡管這些答案另有說明。 另請參閱我的問題here 。
最終編輯:
下面評論中的答案,我已經意識到我實際追求的顯示功能(鑒於 myViewController 是模態的)是:
[self presentModalViewController:myViewController animated:YES];
感謝大家的有益回答。
找到解決方案了!!!!!
即使像這樣無害的事情也會使viewDidLoad
方法調用發生。
在 alloc initWithNibName
之后插入這個
viewController.view.hidden = NO; //calls viewDidLoad
您可能沒有將main.storyboard
假定的ViewController
從Identity Inspector
到您創建的自定義class
。 您可能能夠通過 segues 從其他視圖控制器導航到該控制器,但不會執行任何viewDidLoad()
、 viewWillAppear()
等。
確保 File's Owner(您的 viewController 子類)中的視圖出口連接到實際視圖(即您在屏幕上看到的用於構建 UI 的 480X320 畫布)
另一個原因,回想起來有些明顯:如果在代碼中設置了viewController.view
,則不會觸發 viewDidLoad 事件。
只需使用
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
//Your Code here
}
而不是 viewDidLoad 方法。
對我來說,這看起來像是一個大寫問題。 您在調用 pushViewController 時引用類MyViewController
而不是屬性myViewController
。
檢查您的運行日志是否有錯誤。 幾乎可以肯定,NIB 沒有加載,並且應該有一個錯誤。 最可能的原因是未能將其放入捆綁包中。 查看您的“復制資源”構建階段,並確保實際復制了 XIB。 為模擬器構建,然后進入構建目錄並確保 NIB 在 .app 包中。
除了這里的其他答案,
當您從故事板實例化 ViewController 的標識符不正確時,經常會發生這種情況。 例如
[[self getStoryboard] instantiateViewControllerWithIdentifier:MyVC];
如果MyVC
是某個其他 ViewController 的標識符,則可能會發生這種情況。
OP 在這里使用nib
而不是故事板。 但答案是適用的。
該頁面已顯示,但在調試視圖層次結構和設備(模擬器)中不可見,問題發生基於,我找到了修復:
func viewWillLayoutSubviews{
if day == true{
self.view.backgroundColor = .clear
}else{
self.view.backgroundColor = .blue
}
}
不要試圖在 layoutsubviews 的函數中實現 self.view(viewcontrollers 視圖)。 所以最好在 viewwillappear 或 viewdidload 中使用 self.view。 此問題從 v-14 設備開始發生。
希望它也適用於你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.