Çözülme selamları nedir ve nasıl kullanılır?


584

iOS 6 ve Xcode 4.5, "Çözme Segue" olarak adlandırılan yeni bir özelliğe sahiptir:

Çözme segueleri, bir storyboard'daki mevcut sahne örneklerine geçişe izin verebilir

Xcode 4.5'in sürüm notlarındaki bu kısa girişe ek olarak, UIViewController şimdi birkaç yeni yönteme sahip görünüyor:

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

Çözme segueleri nasıl çalışır ve ne için kullanılabilir?

Yanıtlar:


1267

Kısaca

Bir gevşeme segue (bazen çıkış segue olarak da adlandırılır ) itme, modsal veya popover sekmeleri arasında geri gitmek için kullanılabilir (gezinme öğesini gezinme çubuğundan atmış, popover'ı kapatmış veya kalıcı olarak sunulan görünüm denetleyicisini kapatmış gibi). Bunun da ötesinde, aslında sadece bir tane değil, bir dizi itme / mod / popover sekmesi ile gevşeyebilirsiniz, örneğin navigasyon hiyerarşinizde tek bir gevşetme eylemiyle "geri dön".

Bir gevşeme sekmesi gerçekleştirdiğinizde, gevşetmek istediğiniz görünüm denetleyicisinin bir eylem yöntemi olan bir eylem belirtmeniz gerekir.

Objective-C:

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

Swift:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

Bu eylem yönteminin adı, film şeridinde gevşeme sekmesini oluşturduğunuzda kullanılır. Ayrıca, bu yöntem çözme segue yapılmadan hemen önce çağrılır. UIStoryboardSegueSegue'i başlatan görünüm denetleyicisiyle etkileşime geçmek için (örn. Kalıcı görünüm denetleyicisinin özellik değerlerini almak için) kaynak görünüm denetleyicisini geçirilen parametreden alabilirsiniz. Bu açıdan, yöntem, yöntemiyle benzer bir işleve prepareForSegue:sahiptir UIViewController.

iOS 8 güncellemesi: Çözme segueleri, iOS 8'in Show and Show Detail gibi uyarlanabilir segue'leriyle de çalışır .

Bir örnek

Gezinti denetleyicisine ve üç alt görünüm denetleyicisine sahip bir hikaye tahtasımız olsun:

resim açıklamasını buraya girin

Green View Controller'dan, Red View Controller'a gevşeyebilirsiniz (geri dönebilirsiniz). Maviden Green'e veya Green yoluyla Red'e gevşeyebilirsiniz. Çözmeyi etkinleştirmek için, Kırmızı ve Yeşil'e özel eylem yöntemlerini eklemeniz gerekir; örneğin, Kırmızıdaki eylem yöntemi şöyledir:

Objective-C:

@implementation RedViewController

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}

@end

Swift:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

İşlem yöntemi eklendikten sonra, çıkış simgesine kontrol sürükleyerek film şeridindeki gevşeme sekmesini tanımlayabilirsiniz. Burada düğmeye basıldığında Yeşil'den Kırmızı'ya gevşemek istiyoruz:

resim açıklamasını buraya girin

Gevşetmek istediğiniz görünüm denetleyicisinde tanımlanan eylemi seçmelisiniz:

resim açıklamasını buraya girin

Ayrıca Maviden Kırmızı'ya gevşeyebilirsiniz (bu, navigasyon yığınında "iki adım ötededir"). Anahtar, doğru çözme eylemini seçmektir.

Çözme segue gerçekleştirilmeden önce eylem yöntemi çağrılır. Örnekte, hem Yeşil hem de Mavi'den Kırmızı'ya gevşeme segue tanımladım. Eylem yöntemindeki çözme kaynağına UIStoryboardSegue parametresi aracılığıyla erişebiliriz:

Objective-C:

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
    UIViewController* sourceViewController = unwindSegue.sourceViewController;

    if ([sourceViewController isKindOfClass:[BlueViewController class]])
    {
        NSLog(@"Coming from BLUE!");
    }
    else if ([sourceViewController isKindOfClass:[GreenViewController class]])
    {
        NSLog(@"Coming from GREEN!");
    }
}

Swift:

@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
    if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
        println("Coming from BLUE")
    }
    else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
        println("Coming from RED")
    }
}

Gevşetme aynı zamanda itme / modal sekansların bir kombinasyonu yoluyla da çalışır. Örneğin, kalıcı bir sekmeli başka bir Sarı görünüm denetleyicisi eklersem, sarıdan tek bir adımda Kırmızıya kadar gevşeyebiliriz:

resim açıklamasını buraya girin

Koddan Çözme

Bir şeyi görünüm denetleyicisinin Çıkış sembolüne sürükleyerek bir gevşeme sekmesi tanımladığınızda, Belge Anahattı'nda yeni bir segue görünür:

resim açıklamasını buraya girin

Segue'in seçilmesi ve Nitelikler Müfettişine gidilmesi "Tanımlayıcı" özelliğini gösterir. Segue'inize benzersiz bir tanımlayıcı vermek için bunu kullanın:

resim açıklamasını buraya girin

Bundan sonra, gevşetme seguei tıpkı diğer segueler gibi koddan gerçekleştirilebilir:

Objective-C:

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

Swift:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)

12
+1 harika cevap. Gerçekten kulağa hoş geliyorlar, ama aynı şeyi sevemiyor dismissViewControllerAnimated:completion:veya popViewControllerAnimated:başaramıyorlar mı?
Sam Spencer

32
Tabii ki yapabilirler. Ancak, hikaye tahtaları kullanıyorsanız, gevşeme segueleri genellikle aynı şeyi çok daha az kodla elde edebilir. Aslında artık herhangi bir kod yazmadan kalıcı olarak sunulan bir görünüm denetleyicisini kapatabilirsiniz. Elbette, denetleyicileri koddan kapatmanın yapılması gereken doğru şey olduğu hala birçok durum var.
Imre Kelényi

7
İşlem yönteminizi başlık dosyanıza eklediğinizden emin olun, aksi takdirde Storyboard bilmez.
Kyle C

17
Diğer bir avantajı dismissViewControllerAnimated:completion:ya popViewControllerAnimated:da gevşemekte olduğunuz görüntü denetleyicisine eklediğiniz yöntemin çağrılmasıdır ve bu nedenle, sunulan görünüm denetleyicisini sunulan görünüm denetleyicisinin bir temsilcisi yapmak zorunda kalmadan, sunulan görünüm denetleyicisinin bittiğini bilmenin kolay bir yoluna sahip olmanızdır. .
honus

8
Hafif bir düzenleme önerebilir miyim? RedViewController.m içinde (IBAction) unwindTRed: (UIStoryboardSegue *) unwindSegue koyduğunuz "açık" değildi ve bu da herhangi bir hikaye panosu için yeşil çıkış düğmelerinin "herhangi birinde" evrensel olarak mevcut. Harika bir cevap ve şimdi bunu diğer konular için kullanacağım. Teşekkürler!
John Ballinger

166

StoryBoard'da gevşeme seguelerinin nasıl kullanılacağı ...

Aşama 1)

Eğer istediğiniz bu görünümü denetleyicisi için kod git için gevşeyin ve bu ekleyin:

Objective-C

- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
    //nothing goes here
}

Bu yöntemi Obj-C'deki .h dosyanızda da bildirdiğinizden emin olun.

hızlı

@IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) {
    //nothing goes here
}

Adım 2)

Film şeridinde gevşemek istediğiniz görünüme gidin ve düğmeden bir segue sürükleyin veya kaynak görünümünüzün sağ üst kısmındaki küçük turuncu "ÇIKIŞ" simgesine kadar sürükleyin.

resim açıklamasını buraya girin

Şimdi "- unwindToViewControllerNameHere" ile bağlantı kurmak için bir seçenek olmalıdır.

Hepsi bu kadar, düğmeniz dokunulduğunda segueiniz gevşeyecek.


5
Xcode 4.5 ve önceki sürümlerde, başlıktaki IBAction'ı bildirmenin gerekli olduğunu buldum. Bunun hala doğru olup olmadığını bilmiyorum.
Steven Fisher

2
Adım 2'yi film şeridi olmadan yapmanın bir yolu var mı, yani programlı olarak? Film şeridim (arayüz oluşturucu) berbat ve gevşeme seguelerini (xcode bug) göstermiyor.
Van Du Tran

46

Çözme sekansları, bir dizi sekans aracılığıyla "mevcut" görüş kontrol cihazına gittiğiniz bazı görüş kontrol cihazlarına "geri dönmek" için kullanılır.

Kök görünüm denetleyicisi olarak a MyNavControllerile bir şey olduğunu düşünün A. Şimdi bir itme segue kullanın B. Şimdi gezinti denetleyicisinin viewControllersdizisinde A ve B vardır ve B görünür. Şimdi Cmodal olarak sunuyorsun.

Açma segues ile, artık gelen açma "geri" olabilir Ciçin B(yani modally sunulan görünüm denetleyicisi görevden), temelde modal segue "geri almayı". Kök görünüm denetleyicisine kadar bile gevşeyebilir A, hem kalıcı hem de itme sekmesini geri alabilirsiniz.

Çözme segueleri geri izlemeyi kolaylaştırır. Örneğin, iOS 6'dan önce, sunulan görünüm denetleyicilerini reddetmek için en iyi uygulama , sunulan görünüm denetleyicisini sunulan görünüm denetleyicisinin temsilcisi olarak ayarlamak ve daha sonra sunulanViewController'ı kapatan özel temsilci yönteminizi çağırmaktı . Ses hantal ve karmaşık mı? Öyleydi. Bu yüzden gevşeme segueleri güzel.


7
dismissViewController:animatedSunulan denetleyiciden arayabilirsiniz . Bunu devretmek zorunda değilsiniz. Elbette verileri geri vermeniz gerekiyorsa, temsilci seçmeye veya başka bir yönteme ihtiyacınız vardır.
mxcl

3
dismissViewController:animated:Sunulan denetleyiciden arayabilirken , "en iyi uygulama" gerçekten de, Sun'un belirttiği gibi, sizin için bunu yapmak için sunum denetleyicisine bir temsilci yöntemi çağırmaktı.
Chris Nolet

36

Buradaki diğer cevaplarda bahsetmediğim bir şey, ilk seguein nereden geldiğini bilmediğinizde gevşemeyle nasıl başa çıkacağınız, ki bu benim için daha da önemli bir kullanım örneğidir. Örneğin, iki farklı görünüm denetleyicisinden ( A ve B ) kalıcı olarak görüntülediğiniz bir yardım görüntüleme denetleyiciniz ( H ) olduğunu varsayalım :

AH
BH

Doğru görünüm denetleyicisine geri dönmeniz için çözme segueini nasıl kurarsınız? Cevap, A ve B'de aynı ada sahip bir gevşeme eylemi bildirmenizdir , örneğin:

// put in AViewController.swift and BViewController.swift
@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
    // empty
}

Bu şekilde, çözme hangi görünüm kontrolörünün ( A veya B ) segue başlattığını ve ona geri döneceğini bulur .

Başka bir deyişle, segue geldiğini açıklayan olarak açma eylemin düşünüyorum den daha çok nereye gideceğini daha.


2
Bu bilgi için teşekkürler, bunu arıyordum.
Madhu

2
Zaten çözümü uygularken bu bilgiyi belirtmek gerçekten harika ve bahşişinizi buraya alana kadar hiçbir şey olmuyor Desteğiniz için çok teşekkürler
Amr Angry

Bu harika bir bilgi parçası! Çok teşekkür ederim!
Dominique Vial

24

Hızlı iOS:

Adım 1: Bu yöntemi MASTER kontrolör görünümünüzde tanımlayın. geri dönmek istediğiniz yer:

//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {

    println("Called goToSideMenu: unwind action")

}

Adım 2: (StoryBoard) SLAVE / CHILD EXIT düğmesine sağ tıklayın ve "goToSideMenu" seçeneğini seçin.

resim açıklamasını buraya girin 3. adım: Oluşturun ve Çalıştırın ...


1

Örneğin, viewControllerB'den viewControllerA'ya giderseniz, görünümünüzün altındaki viewControllerA'da arayacak ve veriler paylaşacaktır.

@IBAction func unWindSeague (_ sender : UIStoryboardSegue) {
        if sender.source is ViewControllerB  {
            if let _ = sender.source as? ViewControllerB {
                self.textLabel.text = "Came from B = B->A , B exited"
            }
            
        }

}
  • Seague Source View Denetleyicisini Gevşetin (Çıkış Düğmesini VC'nin çıkış simgesine bağlamanız ve gevşemeye bağlamanız gerekir:

resim açıklamasını buraya girin

  • Çözme Seague Tamamlandı -> TextConabel of viewControllerA Değiştirildi.

resim açıklamasını buraya girin

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.