11

prepareForSegue olmadan başka bir denetleyiciye nasıl basarsınız? segue otomatik olarak seçilmiş bir geçiş kullanarak hedef görünümü denetleyicisi itecektir olarakHazırlık olmadan başka bir denetleyiciye basınForSegue

myClassVC *viewController = [myClassVC alloc]; 
UIStoryboardSegue *segue = [[UIStoryboardSegue alloc] initWithIdentifier:@"pushToMyVC" source:self destination:viewController]; 

if ([segue.identifier isEqualToString:@"pushToMyVC"]) { 
NSLog(@"logging"); 
myClassVC *viewController = (myClassVC *)[segue destinationViewController]; 
[self presentViewController:viewController animated:YES completion:nil];   
} 

cevap

45

, sen Segue Interface Builder bir "film şeridi id" verin ve sonra şunları yapabilirsiniz:

[self performSegueWithIdentifier:"pushToMyVC" sender:self]; 

Alternatif olarak, segue gerçekleştirmek istemiyorsanız Hedef görüntü denetleyicisini başlatabilir ve ardından o görüntü denetleyicisine el ile basabilirsiniz. Yapmanız gereken tek şey o zaman can, hedef görünümü denetleyicisi Interface Builder kendi "Film şeridi id" olduğunu emin olmaktır:

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestinationController"]; 
[self.navigationController pushViewController:controller animated:YES]; 

Sen "itme" (ve dolayısıyla yukarıda pushViewController kullanılan) söyledi. Eğer gerçekten "bir kalıcı görünümü denetleyicisi sunmak" anlamına, o zaman ikinci bir çizgidir:

[self presentViewController:controller animated:YES completion:nil]; 

Gördüğünüz gibi, yok yeni sahneye itmek için prepareForSegue kullanmak var. Hedef görüntü denetleyicisine bilgi aktarmak isterseniz, yalnızca prepareForSegue kullanın. Aksi takdirde gerekli değildir.

Açıkçası, eğer hikaye tahtalarını kullanmıyorsanız (ör., NIB'leri kullanıyorsunuz), işlem tamamıyla farklıdır. Ancak, NIB'ler kullanmıyorsunuzdur, çünkü bu ortamda prepareForSegue uygulanabilir değildir. Eğer NIB kullanıyormuş aşağıdaki gibi Ama olurdu: Benim durumumda

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
[self.navigationController pushViewController:controller animated:YES]; 
+0

Bu yanıt çok yararlı! – Plagorn

3

[self presentViewController:viewController animated:YES completion:nil];, gerekli değildir.

siz manuel ile görünüm denetleyicisi itmek gerekir segue işlemini kullanmak istemiyorsanız

:

[self presentViewController:viewController animated:YES completion:nil];

ama önce Film Şeridi'nde segues kaldırmak emin olun. programlı bir itme segue çağırmak istiyorsanız

0
NSString * storyboardName = @"Main"; 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil]; 
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewControllerID"]; 
    [self presentViewController:vc animated:YES completion:nil]; 
0

tüm viewControllers dinamik inşa edilir. Bu amaçla storyboard'u kullanmıyorum. Bu sizin durumunuz olması durumunda, açmak istediğiniz ve aşağıdaki örnekte olduğu gibi bir itme yapmak istediğiniz viewController sınıfını örneklendirebilirsiniz:

MyViewController* myViewController = [[MyViewController alloc] init]; 
[self.navigationController pushViewController:myViewController animated:YES]; 
İlgili konular