Unwind segue programlı olarak nasıl yapılır?


307

Film şeridini kullanmak çok kolay. Eylemi "Çıkış" a sürüklemeniz yeterlidir. Ama bunu kodumdan nasıl aramalıyım?


33
Bunu geçerli bir soru olarak buluyorum - kendim aldım. Programlı olarak gevşetici bir segue gerçekleştirebilirsiniz 1. manuel bir segue (Dosya Sahibinden Çıkmak için ctrl-drag), 2. IB'de bir isim vererek, sonra 3. kodunuzda normal -performSegueWithIdentifier: sender: yaparak.
Yang Meyer

6
IMO kapatılmamış olmalıdır. Bu soruyu kapatmak için oy kullanan kullanıcılar Obj-C / Cocoa Touch arka planına sahip değil gibi görünüyor.
LJ Wilson

Yang: Nasıl bir isim veriyorsun?
sarfata

Ben sadece [self dismissViewControllerAnimated: YES tamamlama: nil]; programlı olarak çıkmak için. Bunun doğru bir yol olduğunu bilmiyorum.
tangqiaoboy

1
sarfata: Önce viewcontroller'dan "Exit" e ctrl-drag ile bir "manuel çözme sekmesi" oluşturursunuz. Ardından segue'i Belge Anahattı'nda bulabilirsiniz.
2012'de

Yanıtlar:


283
  1. El ile bir segue ( ctrlDosya Sahibinden Çıkış'a sürükleyin) oluşturun,
  2. Yeşil EXIT düğmesinin altındaki Sol Kumanda Menüsünden seçin.

Yeşil EXIT düğmesinin altındaki Sol Kumanda Menüsünden seçin

Gevşetmek için Segue Adını girin.

Sonra, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.segue tanımlamak ile.


25
1) "Dosyanın Sahibi" - bu eski terminoloji değil mi? Görünüm denetleyicisinden Çıkış simgesine sürüklemeyi kontrol etmem için çalıştı. 2) Açıkça görülmesi gerekmesine rağmen, Xcode, IBAction'ın Arayüzünde bir UIStoryboardSegue argümanı alan bir bildirim arıyor; WWDC 2012 oturumu 407 konuşması bundan bahsetmedi ve bu kodu yapıştırmadı. Bu olmadan, Çıkış simgesim kontrol sürüklenirken etkinleşmeyecekti. 3) Büyük kırmızı okunuzun sonunda, Eylem alanında "oraya git" okuna basabileceğiniz çok güzel!
tobinjim

71
Benim gibi, hala bu cevabı uygulamakta sorun yaşayan herkes için, daha kapsamlı bir izlenim ve bu repoya örnek koydum : github.com/bradley/iOSUnwindSegueProgramically (Kendimi tanıtmaya çalışmıyorum , sadece kafamı duvara vurdum saatlerce ve çalışan bir kurulum görmek bana yardımcı olur.)
bradleygriffith

3
@bradleygriffith İnanılmaz süper harika. Harika bir izlenim için teşekkürler!
Eli_Rozen

7
@bradleygriffith Keşke bunu bir cevap yapmış olsaydın, ben de işaretleyebilirim! Benzersiz katkınız hangi görünüm denetleyicisinin hangi kodu alacağını belirlemekti . Bunu hiçbir yerde bulamadım. Teşekkürler!
Aaron Vegh

3
Hala bunun üzerinde durgun olan herkes için anahtar, IBACTION'ın şu anda bulunduğunuz görüntüde değil, kontrol ettiğiniz görüntü denetleyicisinde olması gerektiğidir. @Bradleygriffith bunu GitHub'da açıklıyor, ancak görmedim başka bir yerde bahsedildi. Bu kısım kritik.
Axeva

163

Objective C ve Swift ile tam bir cevap:

1) IBActionHedef görünüm denetleyicinizde (seglamak istediğiniz yerde) bir gevşeme seguei oluşturun. Uygulama dosyasının herhangi bir yerinde.

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2) Kaynak görünümü denetleyicisinde (aradığınız denetleyici) exit + çıkmak için "Etkinlik adı" ndan sürükleyin. Açılır pencerede 1. adımda oluşturulan gevşeme sekmesini görmelisiniz. (Görmüyorsanız, birinci adımı inceleyin). Açılır pencereden unwindToContainerVC: öğesini seçin veya kaynak denetleyicinizi gevşetme IBAction'a bağlama yönteminizi adlandırdığınız her şeyi seçin.

resim açıklamasını buraya girin

3) Kaynak görünümü denetleyicisinin film şeridinin belge anahattında (altta listelenecek) sekmesini seçin ve bir tanımlayıcı verin .

resim açıklamasını buraya girin

4) Çözme segue adınızı değiştirerek, kaynak görüntüleme denetleyicisinden bu yöntemi kullanarak çözme segueini çağırın .

// Amaç C

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

// Hızlı

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

NB. Kaynak denetleyicisinde açıkta kalan özelliklere erişmek için çözme yöntemindeki segue parametresinin sourceViewController özelliğini kullanın. Ayrıca, çerçevenin kaynak denetleyicisinin işten çıkarılmasını işlediğine dikkat edin. Bunu onaylamak istiyorsanız, kaynak denetleyicisine öldürüldükten sonra tetiklenmesi gereken bir günlük iletisiyle bir dealloc yöntemi ekleyin. Dealloc çalışmazsa, tutma döngüsüne sahip olabilirsiniz.


2
Programım çalışmıyor, hatta çağrılmıyor(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
xhg

2
Görünüm denetleyicisi, gevşettiğinizde, yalnızca film şeridinizde var olduğunda, diğer bir deyişle kod uygulamasında özel bir
özellik

@mnl tam olarak ne dediğinden emin değilim, ancak film şeridi sahneleri veya uçlarıyla çalışıyor. Kodda bir viewcontroller sahnesi oluşturuyorsanız, adında IB'yi döndüren herhangi bir yöntem kullanmazsınız, bu da kod ve IB arasında iletişim kurma amacına hizmet ettiği için zaten geçersizdir. Bu sizin yorumunuza hitap ediyor mu?
smileBot

1
Gösteren Resmin ctrl+draggelen ViewControlleretmek Exitson derece yararlı oldu. Teşekkürler!
kbpontius

Swift 4.2 için kullanın: self.performSegue (withIdentifier: "unwindToVC", gönderen: self)
Reefwing

81

bradleygriffithcevabı harikaydı. 10. adımı attım ve basitleştirme için bir ekran görüntüsü yaptım. Bu, Xcode 6'daki bir ekran görüntüsüdür.

  1. Görünümde herhangi bir işlem / düğme olmadan gevşetme oluşturmak için turuncu simgeden kırmızı Çıkış simgesine kontrol sürükleyin.

resim açıklamasını buraya girin

  1. Ardından unwind seguekenar çubuğundan simgesini seçin :

resim açıklamasını buraya girin

  1. Segue Identifier dizesini ayarlama:

resim açıklamasını buraya girin

  1. Bu tanımlayıcıya koddan erişin:
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];

4
Her şeyden önce, gevşetme yöntemi UIViewController. Sonra çözümünüz işe yarayacak
Alex Cio

5
ve bu yeni sekmeye Tanımlayıcıyı ayarlamanız gerekir! Bunu unutma.
kraag22

1
Kaynak görünüm denetleyicisinde programlı olarak "çıkış" bağlantısı oluşturmak mümkün müdür?
Andrew Kirna

13

Sizi [self dismissViewControllerAnimated: YES completion: nil];aramaya döndürecek şekilde kullandım ViewController.


6
Larry, önceki görünüm denetleyicisine dönmek istiyorsanız, yani şu anda çıkmakta olduğunuz kişiyi sunan yöntem, bu tamamen geçerli bir yaklaşım. Soru ortaya çıktı çünkü Xcode 4.5'teki yeni, sunum sırasında bir görünüm denetleyicisinden daha önceki bir görünüm denetleyicisine "gevşeme" yeteneğidir. Ayrıntılar için WWDC 2012 oturum 407'ye bakınız.
tobinjim

11

Apple'ın Çözme Segue Teknik Notundan metin alıntılama: Yalnızca programlı olarak tetiklenecek bir gevşeme segue eklemek için, sahnenin görünüm denetleyici simgesinden control + sürükleyip çıkış simgesine sürükleyin, sonra açılır menüden yeni segue için bir gevşeme eylemi seçin.

Teknik Not Bağlantısı


6

Vishal Chaudhry'nin cevabı benim için çalıştı. Ben de manuel kullanarak sekme tetiklemek için eklemek istiyorum:

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

ViewController içinden, film şeridinde ViewController Sahnesi altındaki çözme selamını seçmeniz ve RHS'deki özellikler görünümünde, Tanımlayıcı alanının yukarıdaki örnekte kodda ("mySegueName") bahsettiğiniz adı içermesini sağlamanız gerekir ).

Bu adımı atlarsanız, yukarıdaki satır sekme adının bilinmediği bir istisna atar.


3

İlgilenenler için ios6'dan önceki sürümlerde çalışacak geriye dönük uyumlu çözüm:

- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {

    for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
        UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
        if ([vc isKindOfClass:vcClass]) {
            [self.navigationController popToViewController:vc animated:animated];
            return;
        }
    }
}

2
Çözme segueleri, gezinti denetleyicisi yığınındaki belirli bir sınıfa geri dönmekten çok daha fazlasını yapar.
Steve Moser

2

SWIFT 4 :

1. Çözmek istediğiniz denetleyicinin içindeki segue ile bir @IBAction oluşturun :

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2. Film şeridinde, işaretten çıkmak ve daha önce oluşturduğunuz yöntemi seçmek için ctrl + denetleyici işaretinden sürüklemek istediğiniz denetleyiciden denetleyin:

resim açıklamasını buraya girin

3. Artık belge ana hatlarında "Çözme segue ...." başlıklı yeni bir satır olduğunu fark edebilirsiniz. Şimdi bu satırı tıklamanız ve tanımlayıcıyı ayarlamak için nitelik denetçisini açmanız gerekir (benim durumumda unwindSegueIdentifier ).

resim açıklamasını buraya girin

4. Neredeyse bitti! Şimdi gevşemek istediğiniz görünüm denetleyicisini açmanız ve segue gerçekleştirecek bir yöntem oluşturmanız gerekir. Örneğin, düğmesi ekleyebilirsiniz ile kodla bağlayın @IBAction bundan sonra içine bu IBAction eklemek perfromSegue (withIdentifier: gönderen :) yöntemi:

     @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

Tek yapmanız gereken bu!


Kaynak görünüm denetleyicisinde programlı olarak "çıkış" bağlantısı oluşturmak mümkün müdür?
Andrew Kirna

1

Swift 4.2, Xcode 10+

Bunun storyboard aracılığıyla oluşturulmamış VC'lerle nasıl yapılacağını merak edenler için (bu soruya "programlı olarak" + "gevşeme segue" aramasından gelenler).

Programlı olarak bir gevşeme sekmesi ayarlayamadığınız göz önüne alındığında, sadece en basit programlı çözüm aramaktır:

navigationController?.popToRootViewController(animated: true)

yığıntaki tüm görünüm denetleyicilerini kök görünüm denetleyicinize geri getirir.


Gezinti yığınından yalnızca en üstteki görünüm denetleyicisini açmak için şunu kullanın:

navigationController?.popViewController(animated: true)


1
bu genellikle istediğinizden daha fazladır - birini geri patlatmanız yeterlidir: [self.navigationController popViewControllerAnimated: YES];
Andy Weinstein

Gerçekten, bunu cevabıma ekledim
10623169

0

Bilginize: @ Vadim'in cevabının bir View Controller içinden çağrılan manuel bir gevşetme sekansı eylemiyle çalışması için şu komutu vermelisiniz:

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

overDiden sınıfı yönteminin içinde viewDidAppear şöyle :

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

ViewDidLoad veya viewWillAppear gibi diğer ViewController yöntemlerine koyarsanız yoksayılır.


3
Kesinlikle yanlış. PerformSegueWithIdentifier'ı istediğiniz yerden arayın.
smileBot

Bu, görünüm yüklenir yüklenmez gevşeme segue yapmaz mı? SİZİN ne zaman yapmak istediğinizi yerine, örneğin bir düğmeye bastıktan sonra.
Pahnev

@Pahnev evet olurdu. Bu cevabın nasıl oy aldığını bilmiyorum. Arama performSegueWithIdentfiertam olarak bunu yapar: bir ViewController'dan diğerine segue gerçekleştirmek
ezcoding

Tamamen yanlış. Lansman sırasında hemen geri sarar.
Lee Probert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.