簡體   English   中英

UIViewController -viewDidLoad 未被調用

[英]UIViewController -viewDidLoad not being called

作為 Cocoa 的新手,我在使用Interface BuilderUIViewController和朋友時遇到了一些問題。

我有一個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 - 我唯一能想到的是selfUIViewController的子類而不是UITableViewControllerpushViewController代碼來自哪里)。

此外,默默地允許消息為零似乎是一個壞主意,盡管這些答案另有說明。 另請參閱我的問題here

最終編輯:

下面評論中的答案,我已經意識到我實際追求的顯示功能(鑒於 myViewController 是模態的)是:

[self presentModalViewController:myViewController animated:YES];

感謝大家的有益回答。

找到解決方案了!!!!!

即使像這樣無害的事情也會使viewDidLoad方法調用發生。

在 alloc initWithNibName之后插入這個

viewController.view.hidden = NO; //calls viewDidLoad

您可能沒有將main.storyboard假定的ViewControllerIdentity 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM