簡體   English   中英

確保在調用loadView之前完全設置了UIViewController

[英]Ensuring that a UIViewController is fully set up before loadView is called

有一個使用UIImageViewUIViewController ,該圖像視圖使用圖像數據( NSData )初始化。 它不使用XIB,但以編程方式創建其視圖:

- (void)loadView
{
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:self.imageData]];
    scrollView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    scrollView.contentSize = imageView.bounds.size;
    scrollView.delegate = self;
    [scrollView addSubview:scrollView];
}

該數據必須通過另一控制器,該控制器被設置alloc S, init S,並推動該視圖控制器到導航控制器:

ImageViewController *imageViewController = [ImageViewController alloc] init];
imageViewController.imageData = someData;
[self.navigationController pushViewController:imageViewController animated:YES];

我如何知道需要完成的所有事情(在本例中是設置數據)是在調用loadView之前完成的? 或者,我不知道,我必須創建一個自定義初始化程序,或者在視圖控制器收到數據時再次調用loadView

我遇到過許多類似的情況,我對將要發生的事情感到困惑,例如使用UITableViewController

我如何知道需要完成的所有事情(在本例中是設置數據)是在調用loadView之前完成的?

因為文檔提到視圖控制器在需要之前不加載視圖。 在導航控制器嘗試將其推入屏幕之前,不需要視圖控制器的視圖。

此外,將imageData分配給圖像視圖的正確位置可能是viewDidLoad (“如果要對視圖執行任何其他初始化,請在viewDidLoad方法中執行此操作。”)。 並且你的loadView方法不會以當前形式做任何可見的事情。 您必須在該方法中為視圖控制器的view屬性分配視圖。

訪問視圖控制器的視圖屬性時將發生loadView。 您編寫的代碼將正常工作,因為第一次訪問view屬性將在pushViewController內部。

如果你寫了這個你有一個問題:

ImageViewController *imageViewController = [ImageViewController alloc] init];
NSLog(@"size = (%.0f, %.0f)", imageViewController.view.frame.size.width,
                              imageViewController.view.frame.size.height);
imageViewController.imageData = someData;
[self.navigationController pushViewController:imageViewController animated:YES];

因為您訪問NSLog中的視圖屬性。 這將導致在設置imageData之前調用loadView。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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