2014-05-05 28 views
5

ViewController'ı programlı olarak bir gezinme denetleyicisine zorlamaya çalışıyorum Ve bunu oluşturmak için storyboard'umu kullanıyorum. Benim items kullanıyorum GenericViewController viewDidLoad yılındainstantiateViewControllerWithIdentifier viewdidload çağrısı görünüyor görünüyor

+ (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]; 
} 

:

burada benim kodudur. Bazı kırılma noktaları sayesinde 'dan sonra GenericViewController viewDidLoad juste'yi items nil'e eşit olarak gördüm.

pushViewController yöntemi sırasında MyViewController viewDidLoad çağrıldığını düşündüm.

viewDidLoad neden instantiateViewControllerWithIdentifier?

--- Güncelleme: --- İşte

benim viewDidLoad

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

    [super viewDidLoad]; 


    [...] 
} 

self.items sıfırdır. bu yüzden hiçbir şey yapılmadı.

+0

tam kod please..what Bir nesneyi başlatırken, canlıdır this..cause değildir method..the sorun myItem ve viewDidLoad olduğu koydu =. –

+0

Daha fazla bilgi vermeniz gerekiyor.InstantiateViewControllerWithIdentifier: 'ı kullandığınız tüm yöntemi gösterin. Yöntem, instantiateViewControllerWithIdentifier :, viewDidLoad'un çağrılmasına neden olmaz, böylece başka bir şey devam eder. – rdelmar

+0

Teşekkürler @rdelmar 'instantiateViewControllerWithIdentifier' 'viewDidLoad' işlevini çağırmayın. Kodumu güncellerim, statik olmayan bir yönetici kullanıyorum ve yeni viewController –

cevap

1

bakınız: kontrolörün görünüşüdür belleğe yüklendiğinde https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/viewDidLoad

viewDidLoad olarak adlandırılır.

viewWillAppear Görünüm denetleyicisine, görünümünün bir hiyerarşiye ekleneceği konusunda uyarır. Bence bu, [self.navigationController pushViewController:viewController animated:YES]; çağrıldığında.

viewDidAppear Görünüm denetleyicisine, görünümünün görünüm hiyerarşisine eklendiğini bildirir. Bu, MyViewController'un navigationController'a eklendiği zamandır.

+0

mantıklı, ancak SO soruları, özellikleri bir denetleyiciye iletmenin iyi bir yolu olduğunu gösteriyor. (http://stackoverflow.com/a/9666389/1436861, http://stackoverflow.com/a/12709167/1436861) –

0

Belirtilen voyage11, denetleyicinin görünümü belleğe yüklendiğinde viewDidLoad çağrılır, ancak birisi bunun mutlaka instantiateViewControllerWithIdentifier yöntemi sırasında gerçekleşmediğine işaret etmiştir. örnek kodla ardından

, ben viewWillAppear yönteminde döngü koyardım:

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

İlk ifadeniz yanlış - viewDidLoad, yalnızca bir görünüm denetleyicisi başlatılarak çağrılmaz. – rdelmar

+0

İyi nokta. Bu çıkarımı kaldırmak için cevabımı güncelledim. –

4

hala aynı sorun olabilir herkes için.

Benzer bir durum vardı ve sadece loadViewIfNeeded() yöntemini kullanarak çözdüm.

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

Böylece, görünüm içindeki her şeye erişebilirim.

+0

Dokümantasyonda belirtildiği gibi, loadView() asla doğrudan çağrılmamalıdır. https://developer.apple.com/reference/uikit/uiviewcontroller/1621454-loadview – Ramiro

0

Sen kullanmayı deneyebilirsiniz "[öz loadViewIfNeeded]" obj-c veya "self.loadViewIfNeeded()" hızlı için için; 'Self' Sizin ViewController

apple: loadViewIfNeeded

İlgili konular