Soru Zaten yüklenmiş olan bir UIViewController'a nasıl geri dönülür?


Hikaye panosunun bir görünümü var, belirli bir eylemi gerçekleştirmek için bir düğme var. Bu eylemi gerçekleştirmek için, kullanıcının oturumu açması gerekir. Düğme işleyici, kullanıcı oturum açtığında test eder ve YES ve bir başka ise, bir segue gerçekleştirir. HAYIR, oturum açma denetleyicisine basar. İlk görüntüleme kontrolörüne bağlanan başka bir segue daha vardır, bu yüzden eğer giriş başarılı olursa kullanıcı bıraktığı yerden alabilir. Görünüm denetleyicileri bir gezinme denetleyicisine yerleştirilmiştir.

Sorun şu ki, 'return' segue, view controller'ın yepyeni bir örneğini yüklüyor ve orijinal örneğe başvurmuyor, bu yüzden boş arayüz elemanları ve o view controller'ın bellekte 2 kopyası ile bitiyor.

Görünüm denetleyicisinin orijinal örneğine nasıl geri dönebilirim?


46
2018-04-04 00:58


Menşei




Cevaplar:


Kullanımınızı kabul ederek "push"demek sen bir UINavigationControllerdaha sonra yığının üstüne dönmek için aşağıdakileri kullanabilirsiniz.

[self.navigationController popToRootViewControllerAnimated:YES];

veya

UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>];
[self.navigationController popToViewController:prevVC animated:YES];

belirli bir seviyeye açılır <n> seviye.

veya

[self.navigationController popViewControllerAnimated:YES];

Sadece bir seviyeyi açmak istiyorsanız navigasyon yığınını yedekleyin.


137
2018-04-04 01:57



Önceden bir ekranda ViewDidLoad'a yüklenen bir UIBarButton'um var (geri döneceğimiz). Kodunuzu kullandığımda UIBar hiç göstermiyor. Bir fikrin neden? - c1pherB1t


Bir önceki denetleyiciye geri dönmek için bir segue kullanmak yerine, o anki durum denetleyicisini reddetmek için geri dönme ile ilgili olayı kullanmanız gerekir (segue modal ise) ya da gezinme denetleyicisinden ( basma) ve önceki denetleyici otomatik olarak gösterecektir.

Örneğin, giriş ekranınızda bir düğmeye bastığınızda geriye giden modal segue gerçekleştirildiyse, başarılı bir girişle eyleminizle bağlantı kurduğunuz düğmenin storyboard'unda ve içerideki dokunma olayındaki segue'i silersiniz. Arayacağım:

 [self dismissViewControllerAnimated:YES completion:nil];

Hikaye panosunda, düğmeyi sağ tıklayıp gönderilen olayın içerisindeki dokunuşu, görünüm denetleyicisi sahnesinin ilk yanıtlayıcısına sürükleyeceksiniz. Bu, segue geçişini gerçekleştirdiğinizde yürütülen ters geçişi yürütür. Bunun için modal bir segue kullanabilirsiniz, navigasyon kontrol cihazını kullanmaya gerek yok.

Eğer giriş görünümünü navigasyon kontrol cihazına aktardıysanız, onu yığından çıkarmanız gerekir (eğer önceki görünüme dönersek). Bunlardan birini kullanın:

    [[self navigationController] popViewControllerAnimated:YES];  // goes back to previous view
[[self navigationController] popToViewController: myViewControllerAfterLogin animated:YES]; // goes back to specific view on stack. 
[[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack

Animasyonlu geçiş, segue üzerinde kullanılan geçiş türünü tersine çevirmelidir, bu nedenle görünümü kapattığınızda kıvrılan kıvrımlar aşağı doğru olacaktır.


33
2018-05-20 21:07



Bir itme seferi için slayt dışı bir efekt gibi özel bir istek kullanıyorsanız pop, özel alıcınızın tersi olmayacak, yalnızca bir slayt efekti olacaktır. - nenchev


İleri gitmek için bir segue kullanıyorsanız, geri dönmek için bir gevşeme segue kullanmalısınız. Bir gevşetmek segue nasıl kullanılacağı hakkında detaylı bilgi Teknik Not TN2298 Unwind Segues Kullanarak.


5
2018-04-19 16:11





malhal haklı - onun linke tıklayarak değer.

Bu kod, Apple'ın örneğinden biraz hareket etmiş ve daha esnek. Üç sahnem var ama sadece bir tane özel ViewController .m dosyası. Gezinti yığını istemedim. Sonraki sahnelere erişim, düğmelerden gelir. Bu satırı base view controller .m dosyasına ekledim:

- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{}

Sonra üçüncü sahnede bir düğmeden çıkış simgesine sürükleyip sürükleme eylemini seçtim. Şimdi dismissViewController yöntemini çağırmaya gerek kalmadan sahne 3'ten sahne 2'ye geri düşer.


2
2018-06-01 12:24



Sonunda anladığım en önemli şey, kullandığınız özel çıkış sekreteriyle ilişkili unwindAction'ı uygulayan bir denetleyiciye ulaşıncaya kadar yığınınızı gevşetecek olmasıydı. Böylece, birden fazla çıkış seferi tanımlayarak farklı gevşeme eylemleri tanımlayabilirsiniz ve ardından, denetçilerin her biri için, iniş yapmak istediğiniz belirli eylemi gerçekleştirirsiniz. - Andy Weinstein