2014-05-05 31 views
5

我想推出一個ViewController以編程方式導入到導航控制器,而我正在使用我的故事板來創建它。instantiateViewControllerWithIdentifier似乎調用viewdidload

這裏是我的代碼:

+ (void) pushViewController:(NSString *) identifier ForItems:(NSMutableArray *) items sender:(UIViewController *) sender { 
    GenericViewController *viewController = (GenericViewController *)[sender.storyboard instantiateViewControllerWithIdentifier:identifier]; 

    viewController.items = [[NSMutableArray alloc] init]; 
    [viewController.items removeAllObjects]; 
    [viewController.items addObject:[[NSMutableArray alloc] init]]; 
    [viewController.items[0] addObjectsFromArray:items]; 

    [sender.navigationController pushViewController:viewController animated:YES]; 
} 

GenericViewController viewDidLoad我用我的items。由於一些突破點,我看到GenericViewController viewDidLoadinstantiateViewControllerWithIdentifier之後是正確的,items等於零。

我以爲在pushViewController方法中調用MyViewController viewDidLoad

任何想法爲什麼viewDidLoadinstantiateViewControllerWithIdentifier期間被調用?

---更新:---

這裏我viewDidLoad

- (void)viewDidLoad 
{ 
    for (MyItem *currentItem in self.items[0]) { 
     [Do Something] 
    } 

    [super viewDidLoad]; 


    [...] 
} 

self.items爲零。所以沒有做任何事情。

+0

把完整的代碼please..what是myItem和viewDidLoad中method..the問題不this..cause當你啓動一個對象,它是活的。 –

+0

您需要提供更多信息。顯示你使用instantiateViewControllerWithIdentifier的全部方法:方法instantiateViewControllerWithIdentifier:不會導致viewDidLoad被調用,所以其他事情正在進行。 – rdelmar

+0

謝謝@rdelmar我很確定'instantiateViewControllerWithIdentifier'不要調用'viewDidLoad'。我更新我的代碼,我正在使用一個靜態管理器instanciate,並推動我的新viewController –

回答

1

參見:https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/viewDidLoad

viewDidLoad當控制器的視圖被加載到內存被調用。

viewWillAppear通知視圖控制器其視圖即將添加到視圖層次結構中。我認爲這是在[self.navigationController pushViewController:viewController animated:YES];被調用時。

viewDidAppear通知視圖控制器其視圖已添加到視圖層次結構中。這是當MyViewController被添加到navigationController時。

+0

它是有意義的,但所以SO問題表明它是一種將屬性傳遞給視圖控制器的好方法。 (http://stackoverflow.com/a/9666389/1436861,http://stackoverflow.com/a/12709167/1436861) –

0

在voyage11中提到過,當控制器的視圖被加載到內存中時,調用viewDidLoad,儘管有人指出在instantiateViewControllerWithIdentifier方法中不一定會發生這種情況。

按照你的示例代碼,我把循環在viewWillAppear中方法:

- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; // good practice to call the super 
    for (MyItem *currentItem in self.items[0]) { 
     [Do Something] 
    } 
} 
+0

你的初始語句不正確 - viewDidLoad不會僅僅通過實例化一個視圖控制器來調用。 – rdelmar

+0

好點。我已經更新了我的答案,以消除這種含義。 –

4

對於任何可能仍然有同樣的問題。

我有一個類似的情況,並通過調用loadViewIfNeeded()來解決它。

let sb: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
let controller = sb.instantiateViewControllerWithIdentifier("LoadingView") as! LoadingViewController 
controller.loadViewIfNeeded() 

我可以訪問視圖中的所有內容。

+0

正如文檔所述,不應該直接調用loadView()。 https://developer.apple.com/reference/uikit/uiviewcontroller/1621454-loadview – Ramiro

0

您可以嘗試使用 「[自loadViewIfNeeded]」 的OBJ-C或 「self.loadViewIfNeeded()」 爲迅速; 「自我」 =您的視圖控制器

apple: loadViewIfNeeded