2014-09-09 8 views
28

Sadece iOS uygulaması yazıyorum ve "Göster" ve "Ayrıntıyı Göster" segue ile showViewController:sender: ve showDetailViewController:sender: kombinasyonunu kullanarak yeni uyarlamalı sunumları kullanıyorum yöntemleri.showViewController'ın programatik karşıtı nedir: gönderen:

Sorum showViewController:sender: çağırdıktan sonra geri dönmek için programatic yolu nedir nedir? Görünüm denetleyicisinin gösterilme şekli ana içeriğine bağlıdır. Örneğin. UINavigationControllershowViewController:sender:'da gezinme kümesine yeni bir denetleyici iter, ancak denetleyici grafiğinde UIKit konteyneri yoksa, showViewController:sender: bunun yerine bir sunum yapar.

ben

if (self.navigationController) { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
else if (self.presentingViewController){ 
... 
else if ([self.parentViewController isKindOfClass:[CrazyCustomContainer class]]){ 
    [self.parentViewController someWackyUnwindMethod]; 
} 
... 

vs ... bu yüzden gösterilmeden tersine çevirmek için genel bir yolu yoktur kontrol etmek olanaksız görünüyor kendi keyfi konteyner denetleyicisi yazabilirsiniz göz önüne alındığında? Gördüğüm tek çözüm, her şey için istekli segues kullanmaktır. Çok sıkıntı yok ama merak ediyorum.

+1

Bunun bir nedeni, bir modelde bir iptal düğmeniz ve normal 'dismissViewControllerAnimated: 'işlevini çağırmanız ve bir navigationController ile geri bir yerleşik düğmenin bulunmasıdır. Bu nedenle, çoğu zaman işten çıkarmaları, tanıtıcı sunumlarınızla aynı şekilde ele almanız gerekmez. –

+1

Ama bu benim nokta: 'showViewController:' bir itme veya sunum yapabilirsiniz. Sunulan görüntü denetleyici ekranda nasıl görüntülendiğini bilmemeli, çünkü [self.navigationController popViewControllerAnimated:] 'gibi bir şey yapmak, eğer sunulmuş olmasından dolayı bazen başarısız olabilirse iyi değildir ... – jackslash

+0

navController pop yapmaya gerek yok. Bir sırt olurdu. –

cevap

20

showViewController:sender: ve showDetailViewController:sender:'un Programming iOS 8: Dive Deep into Views, View Controllers, and Frameworks içinde nasıl çalıştığı hakkında bir bölüm vardır. Bu yöntemler denir zaman

kendileri üzerinde targetViewControllerForAction:sender: arayıp döndürülen nesne üzerinde bu yöntemi çağırın. Hedef nesne daha sonra görüntü denetleyicisini uygun bir şekilde görüntüleyebilir. Örneğin, bir gezinme denetleyicisi, görünüm denetleyicisini gezinme yığınına iter. Bu nedenle, dismissVC: genel bir genel yöntem oluşturabilir ve farklı UIViewController alt sınıflarını geçersiz kılabilirsiniz. Bu nedenle, bir dismissVC: yöntemi oluşturabilirsiniz.

extension UIViewController { 
    func dismissVC(sender:AnyObject?) { 
     if let presentingVC = targetViewControllerForAction("dismissVC", withSender: sender) as? UIViewController { 
      presentingVC.dismissVC(self) 
     } 
    } 
} 

extension UINavigationController { 
    override func dismissVC(sender: AnyObject?) { 
     popViewControllerAnimated(true) 
    } 
} 

extension CrazyCustomContainer { 
    override func dismissVC(sender: AnyObject?) { 
     someWackyUnwindMethod() 
    } 
} 

Bu şekilde, dismissVC: yöntemini çağırdığınızda, her zaman doğru bağlama göre görünüm denetleyicisi görevden eğer.

+0

Evet, cevabı bu. Aferin. – jackslash

+8

Yani, buna dayanarak, sorusuna verilen asıl cevap “showViewController: sender:'? 'In karşısında bir programatik var mı? ** ** değil. Apple'ın uyarlamalı sunum yapmak için kullandığı temel mekanizmayı kullanarak kendi genel sürümünüzü etkili bir şekilde uygulamanız gerekir. – smileyborg

+0

Yup, bu durumda. Her ne kadar sorularımda, onları desteklemek için de kodlara ihtiyaç duyanlar istemek için programlı bir alternatif arıyorum. Bu cevap% 100 istediğimi yerine getiriyor. – jackslash

0

İşte size yardımcı olabilecek showViewController var kullanıyorum bir hüner.

if let nav = navigationController { 
    // We have a navigation controller so we'll have a back button 
} 
else { 
    // no navigation controller, need a cancel button 
    // ... Add Cancel Button 
} 

Temel olarak, bulunduğunuz yeri kontrol edin. Ardından, viewDidDisappear numarasına herhangi bir kaydetme kodu koyabilirsiniz ya da her ikisi için de bunun gibi bir şey yapabilirsiniz. Başka bir seçenek presentationViewController'u kontrol etmektir, ancak bu her zaman modal sunumunu garanti etmez.