Alt görünüm denetleyicilerini storyboard içindeki üst görünüm denetleyicisine bağlama

çocuk görünümü denetleyicilerini Storyboard'da özel bir kapsayıcı görünümü denetleyicisine ilişkilendirebilir misiniz?

çocuk görünümü denetleyicilerini bir sekme görünümü denetleyicisine bağlayabilir ve bir görünüm denetleyicisini bir gezinti denetleyicisine bağlayabilirsiniz.

çocuk Vc'leri kabul etmek için VC konteynerine ne yapmalıyım?

56
tarihinde sordu AstroCB 2011-11-20 05:14:18
kaynak

5 ответов

Caleb ve Matt'in cevaplarının bir kombinasyonu olarak yaptım:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"cpdc_check_embed"]) {
        self.checkVC = segue.destinationViewController;
    }
}

... checkVC konteyner denetleyicisinde bir özelliktir:

@property (weak,nonatomic) PXPCheckViewController * checkVC;

sadece ayarlamak zorunda embed segue Storyboard ID ne istersen (bu durumda, cpdc_check_embed ):

check embed screen in Xcode

...ve sonra -prepareForSegue:sender: tanımlayıcısını kontrol edin .

Bir şey düzgün çalışmıyor ve ne olduğundan emin değiliz. daha sonra tekrar deneyin veya bunun yerine bir şehrin, yerin veya adresin yakınında arama yapın.

enter image description here

75
cevap Ben Mosher 2012-09-05 19:04:44
kaynak

storyboard, ilişkiler açıkça gösterilecek şekilde alt/kök görünüm denetleyicilerine segues göstererek, dahili konteyner görünümü denetleyicileri ile çok güzel bir şekilde ilgilenir. Çocukların ve ebeveyn görünüm denetleyicilerinin farklı sahnelere nasıl ayrıldığı da güzel.

kendi projenizde bu etkiyi elde etmek istiyorsanız, mükemmel ama çok basit olmayan bir hile var. Örneğimde, hareket eden bir kapsayıcı görünümü denetleyicisine sahip olduğumu varsayalım yalnızca iki sekme ile sekme çubuğu Denetleyicisi gibi, 've' sağ 'sol. Bir sahnenin üst görünüm denetleyicisini temsil etmesini istiyorum ve iki ayrı sahne hem 'sol' alt görünüm denetleyicisini hem de 'sağ' alt görünüm denetleyicisini temsil ediyor.

imkansız olsa da, konteyner görünümü denetleyicisinden farklı sahnelerde çocuklarına IBOutlet yaratabilirsem güzel olurdu ve daha sonra konteyner görünümü denetleyicim görüntülendiğinde ebeveyn/çocuğu kurun kurallara göre ilişkiler uiviewcontroller belgeleri tarif . 'Sol' ve 'sağ' çocuk görünümü denetleyicilerimize referanslarımız olsaydı, ilişkileri sorunsuzca kurabilirdik.

bu referans probleminin standart çözümü, Object çıkışlarını kapsayıcı görünüm denetleyicisinin sahnesine sürükleyerek ve daha sonra sınıf türünü örnek olarak belirterek alt görünüm denetleyicilerine başvurular oluşturmaktır çocuk görünümü denetleyicisi sınıfları.

çocukların Apple'ın yerleşik kapları gibi farklı sahnelerde ayrılmasını sağlamak için, ancak farklı bir hile kullanacağız. İlk olarak, kapsayıcı Sınıfımızda, ContainerViewController :

ilan edilen aşağıdaki özelliklere sahip olduğumuzu varsayalım
@property (nonatomic, strong, readwrite) UIViewController *leftViewController;
@property (nonatomic, strong, readwrite) UIViewController *rightViewController;
Bizim storyboard

, 'sol' görünüm denetleyicisini temsil eden sahneyi seçin. Öznitelikler denetçisinde, view controller'ın identifier özelliğini şu şekilde ayarlayın "cvc_leftViewController" ("cvc_" ContainerViewController anlamına gelir, ancak gerçekten tanımlayıcı istediğiniz her şey olabilir). Doğru görünüm denetleyicisinin sahnesi için aynı şeyi yapın, "cvc_rightViewController" olarak ayarlayın .

şimdi ContainerViewController 's viewDidLoad yöntemi içine aşağıdaki kodu eklemek:

if (self.storyboard) {
    _leftViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"cvc_leftViewController"];
    _rightViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"cvc_rightViewController"];
}

ContainerViewController storyboard'dan yüklendiğinde, ilgili sahnelerden 'sol' ve 'sağ' görünüm denetleyicilerini alıp referansları ayarlayacaktır özellikleri ile onları. Şimdi alt görünüm denetleyicisi örneklerinin denetimine sahip olduğunuza göre, istediğiniz gibi üst / alt ilişkileri ayarlayabilirsiniz. Bunun nasıl yapılacağını öğrenmek için Uıviewcontroller belgelerine bakın .

bu hile mükemmel değildir ve birçok uyarı vardır, ancak dikkatli iseniz projeniz için güzel çalışmasını sağlayabilirsiniz.

Düzenle: bu tamamen gereksiz ve olmasa da Eğer gerçekten gerçekten , storyboard ekran bağlantılarını Kapsayıcınızdan çocuğunuzun görünüm denetleyicilerine tıpkı Apple'ın yerleşik kapları gibi görmek istiyorsanız, yukarıdaki yöntemimi kullanın ve ardından doğrudan kapsayıcı sahnesinin arasında segues'u çocuk sahnelerine ayarlayın ve bu seguesleri asla gerçekleştirmeyin. Şimdi her şey doğru çalışacak ve çok güzel görünecek.

15
cevap Matt 2012-07-03 22:19:01
kaynak

çocuk görünümü denetleyicilerini özel bir kapsayıcı görünümüne ilişkilendirebilir misiniz storyboard denetleyici?

bence burada sorduğunuz şey, bir sahnedeki bir görünüm denetleyicisini farklı bir sahnedeki bir görünüm denetleyicisinin çıkışına nasıl bağlayacağınız. Bunun mümkün olduğuna inanmıyorum, belki de storyboard makinelerinin aynı anda yüklenen bir storyboard'daki tüm sahneleri olmayabilir.

muhtemelen soruyorsun bunun nedeni, bir sahneden diğerine geçiş yaparken bir görünüm denetleyicisinden diğerine bazı bilgileri geçmek istediğiniz için. Storyboards ile çalışırken bunu yapmanın yolu, segue tarafından etkilenen bir veya her iki görünüm denetleyicisinde -prepareForSegue:sender: geçersiz kılmaktır. segue parametresinde sağlanan uistoryboardsegue nesnesi sourceViewController ve destinationViewController özellikleri ve identifier özelliği vardır. Verileri aktarmak üzere olan segue tanımlamak için bu özellikleri kullanabilirsiniz görünüm denetleyicileri arasında.

Ray Wenderlich'in blogu, size yardımcı olabilecek storyboard'ları kullanma konusunda güzel bir iki parçalı öğreticiye sahiptir:

  • Bölüm 1 , bir storyboard projesi kurma sahneleri ekleme ve segues oluşturma kapsar.

  • Bölüm 2 , prepareForSeque yöntemi de dahil olmak üzere sahneler arasında geçiş yapmak için segues kullanarak ilgilenir yukarıda bahsedilen.

iOS 5, birden fazla görünüm denetleyicisinin aynı sahnede aktif olmasına izin verir (her ne kadar biri hala sorumlu olsa da), bu nedenle storyboardunuzdaki tek bir sahnenin birkaç denetleyiciye sahip olabilir. Bu denetleyicileri birbirine bağlamak için çıkışları kullanabilirsiniz ve bu bağlantıları IB'DE yaptığınız gibi yapılandırabilirsiniz: kontrol-aynı sahnede bir denetleyiciden diğerine sürükleyin. Her zamanki çıkış listesi size izin vermek için açılır hangi prizin bağlanacağını seçin.

7
cevap Caleb 2011-11-23 00:24:51
kaynak

bir sahnede birden fazla denetleyiciyi kullanmanın anahtarı (burada olduğunuza inanıyorum), diğer görünüm denetleyicisini temsil etmek ve çıkışlarını bağlamak için IB'DEKİ nesneler listesinden gizemli nesneyi kullanıyor.

bu cevap ıOS 5 de storyboard kullanarak özel görünüm denetleyicisi kapsayıcısı nasıl oluşturulur umarım yardımcı olacaktır. Cevap aynı zamanda çok yararlı bir çalışma örneği uygulaması sağlar.

5
cevap Matt__C 2017-05-23 14:52:55
kaynak

@Ben'in (aksi halde makul) cevabı ile ilgili sorun, yalnızca bir yuvalama seviyesinde çalışmasıdır. Bunun ötesinde, sonraki her VC'NİN prepareforsegue'de yuvalama görünümü denetleyicisini kaydetmek için özelleştirilmesini gerektirir.

bunu çözmek için, Storyboard'a ekleyebileceğiniz, bir sahneye bağlanabileceğiniz ve daha sonra type and restorationıd temel alan bir genel dizinde üst VC'Yİ kaydedeceğiniz bir NSObject tabanlı dizini keşfetmek için çok fazla zaman harcadım. Bu çalışır / çalışabilir, ancak sonunda çok fazla çaba sarf eder ve yine de görsel olarak bağlama ve programlı olarak bakmak için iki adımlı süreci gerektirir.

benim için en basit ve en genel çözüm,

görünüm denetleyicisi hiyerarşisini tembellikle indirmektir

basit test projemde, viewDidLoad için aşağıdaki satırları ekledim:

    self.left.data = [
        "Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro.",
        "De carne lumbering animata corpora quaeritis." ]

nerede left olarak tanımlanır:

lazy var left:CollectionViewController = { [unowned self] in
    return self.childViewControllerWithId("Left") as! CollectionViewController }()

ve childViewControllerWithId olarak tanımlanır:

extension UIViewController {
    func childViewControllerWithId(rid:String) -> UIViewController? {

        // check immediate child controllers
        for vc in self.childViewControllers as! [UIViewController] {
            if vc.restorationIdentifier == rid { return vc }
        }

        // check nested controllers
        for vc in self.childViewControllers as! [UIViewController] {
            if let vc = vc.childViewControllerWithId(rid) {
                return vc
            }
        }

        assert(false, "check your assumptions")
        return nil
    }
}

gerekirse, Türüne göre diğer find varyantları yapabileceğini unutmayın. Ayrıca, Yukarıdakilerin, Storyboard dosyasındaki restorasyon kimliğini tanımlamanızı gerektirdiğini de unutmayın. Aynı görünüm denetleyicisinin tekrarlanan örneklerine sahip olmadıysanız, type kullanmak daha kolay olacaktır.

ve umarım açık olanı belirtmek için, prepareForSegue uygulamaya gerek yoktur, ne de tembel yükleme kullanmak zorunda değilsiniz, sadece find(...) demelisin.

4
cevap Chris Conover 2015-03-14 02:43:40
kaynak