2011-12-05 28 views
13

Storyboard tabanlı bir iPhone uygulaması yazıyorum ve devlet restorasyonu üzerinde çalışıyorum. Normal olarak istendiğinde, onları canlandırmak istiyorum, ancak bir navigasyon hiyerarşisinin birkaç seviyesini geri yüklerken, sadece son segenin canlandırılmasını istiyorum. İki grup hakem kurmanın dışında — normal bir itme kullandıran bir set ve özel bir animasyon yapmayan itme kullaranı kullanan başka bir set — yapmaya çalıştığım şeyi elde etmenin herhangi bir yolu var mı?Animasyon olmadan push segue

cevap

14

Uygulama denetleyicileri veya film senaryolarından bağımsız olarak, denetçi yığınını doğrudan değiştirmek mümkündür.

Bu teknik, derin bir yığın görüntü denetleyicisini geri yüklemek ve en iyi görünüm denetleyicisine yalnızca tek bir işaret uygulayarak/canlandırmak için kullanabilirsiniz. (Bu amaç için belirli bir itme yakalama birimi oluşturmanız gerekecektir.)

Örneğin, iki denetim denetleyicisi yığınının geri yüklenmesi için aşağıdakileri yapabilirsiniz. Bu örnekte, var olan bir görünüm denetleyicisindeki bazı eylemlerin durumun geri yüklenmesine yol açtığı varsayılmıştır, ancak bunu Uygulama Temsilcinizden kolayca gerçekleştirebilirsiniz.

[self performSegueWithIdentifier:@"Page2Express" sender:self]; 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"Page2Express"]) 
    { 
     // Get any state data you need to from Core Data 
     CoreDataType *valuePulledFromCoreData = // ... 

     // Set up the page 2 view controller as you normally would 
     Page2ViewController *page2ViewController = segue.destinationViewController; 
     page2ViewController.instanceVariable = valuePulledFromCoreData; 

     // Create a loose, page 1 view controller and set it up as required 
     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 
     Page1ViewController *page1ViewController = [storyboard instantiateViewControllerWithIdentifier:@"Page1ViewController"]; // Ensure you have this identifier set up in your storyboard 
     page1ViewController.instanceVariable = valuePulledFromCoreData; 

     // Add the page 1 view controller to the top of the navigation stack (to be later obscured in the segue by the page 2 view controller) 
     NSMutableArray *viewControllers = [[self navigationController].viewControllers mutableCopy]; 
     [viewControllers addObject:page1ViewController]; 
     [self navigationController].viewControllers = viewControllers; 
    } 
} 

Bunun yerine, animasyon içermemeyi tercih ederseniz, daha kolay olur. Yalnızca denetleyici yığınını (ve herhangi bir segg kullanmadan) - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ve - (void)applicationWillEnterForeground:(UIApplication *)application'dan manipüle ederek durumu geri yükleyebilirsiniz.

Her iki yol da, varolan hikaye tahtanız (tahtaları) ve segues'lerinizle birlikte sorunsuz bir şekilde çalışacaktır.

+0

Sadece 'outViewController: animated: 'kullanmak yerine' viewControllers' dizisini işlemek için bir neden var mı? –

+4

'pushViewController: canlandırılmış:' yalnızca bir görünüm denetleyicisini yığına eklemez - ayrıca görünüm denetleyicisini göstermek için görünümü yeniler. Bu durumda, 'page1ViewController' öğesini kısaca bile görmek istemiyoruz, bu yüzden onu doğrudan kendimize eklemeliyiz. –

İlgili konular