Storyboard ile özel görünümler


96

Karmaşık ekranlarda (Görünüm Denetleyicileri) her şeyi daha küçük parçalara ayırırdım (ben bunlara widget diyorum). Bu widget'lar temelde a MyWidget.hve bir MyWidget.mdosyadan ve ayrıca bir MyWidget.xibdosyadan oluşur; burada kök öğe bir UIViewve MyWidget sınıfı UIView'ın Dosya Sahibi'dir. Bu parçacığın başlangıcında bir loadNibNamed.

View Controller'ımda [[MyWidget alloc] init], View's Controller ana görünümüne bir alt görünüm olarak eklediğim bir a yapıyorum . Şimdiye kadar bu mükemmel çalışıyor.

Şimdi merak ediyorum, aynı şeyi storyboard ile nasıl yapacağımı, çünkü gerçekten bir UIViewyere sürüklemeye başlayamıyorum , her zaman istemediğim bir ile başlamak UIViewControllerzorundayım.

Bunu bir Öykü Panosu ile yapmanın mümkün bir yolu yoksa, ana ekranlarım ve bölümleri için Öykü Panosu'nu kullanarak ve özel görünümleri tanımlamak için ayrı bir .xib dosyası kullanarak bunu eski yöntemle yapabilir miyim?


xibHikaye panosunda değil, görünüm denetleyicileriniz için ayrı ayrı URL'ler oluşturmak ister misiniz ?
tipycalFlow

Buna bir çözüm buldunuz mu?
aryaxt

@aryaxt: Storyboard ve xib'lerin bir karışımını kullanıyorum. Karmaşık görünümler veya widget'lar için kök olarak yalnızca UIView içeren ana ekranlar ve xib'ler için hikaye panosu. Yani asıl soruma bir cevap değil (film şeridi kullanarak), ama temelde daha önce yaptığım şeyi yapmak.
znq

bu günlerde, sadece bir kapsayıcı görünümü kullanın , gerçekten bu kadar basit .. stackoverflow.com/questions/23399061/…
Şişko

Yanıtlar:


189

Widget / görünümü ayrı bir .xib dosyasına koymak işe yarar ve özellikle aynı görünüme birden çok Görünüm Denetleyicisinden başvurmak istiyorsanız uygundur.

Bununla birlikte, bazen ek görünümü / widget'ı aynı film şeridi içinde görmek istersiniz ve bu mümkündür. İşte bunu nasıl yapıyorsun:

  1. IB'de görünüm denetleyicinizi seçin (görünümün altındaki siyah çubuğa tıklayın), ardından Nesne Kitaplığından bir UIV görünümünü siyah çubuğa sürükleyin:

    görüntü açıklamasını buraya girin

  2. Siyah çubukta bir görünüm olduğunda, IB'deki diğer görünümler gibi somutlaştırılır, ancak kodda siz bunu yapana kadar görünüm hiyerarşinize eklenmez. Gerekirse görünümün sınıfını kendi alt sınıfınızla eşleşecek şekilde değiştirin:

    görüntü açıklamasını buraya girin

  3. Herhangi bir görünümü bağlayacağınız gibi onu görünüm denetleyicinize bağlayabilirsiniz: görüntü açıklamasını buraya girin

  4. Eklenen görünüm Belge Taslağınızda görünür ve orada da eylemleri ve referansları bağlayabilirsiniz:

    görüntü açıklamasını buraya girin


Şimdi, geriye kalan sorun, kaç kez tıklamaya veya çift tıklamaya çalışsanız da görünümü gerçekten görememenizdir, bu da onu aynı film şeridine koyma amacını ortadan kaldırır. Neyse ki bildiğim iki geçici çözüm var.

İlk çözüm, görünümü siyah çubuktan tekrar görünüm denetleyicinizin görünümüne sürüklemek, düzenlemek ve işiniz bittiğinde siyah çubuğa geri sürüklemektir. Bu zahmetli ama güvenilir.

Diğer geçici çözüm daha titiz, ancak tüm görüşlerimi aynı anda görmeme izin verdiği için tercih ediyorum:

  1. Nesne Kitaplığından yeni eklenen görünümünüze bir UITableView sürükleyin.

  2. Sonra bir UITableViewCell'i bu UITableView'a sürükleyin.

    görüntü açıklamasını buraya girin

  3. Bunu yaptığınızda, görüntünüz sihirli bir şekilde yan taraftan ortaya çıkar, ancak istemediğiniz bir UITableView'a sahipsiniz. Bunu 0x0 olarak yeniden boyutlandırabilir veya silebilirsiniz ve UIView görünümünüz (genellikle) hala görünür durumda kalır.

  4. Ara sıra, ikincil görünüm IB'de tekrar gizlenir. UITableView'ü sildiyseniz veya UITableView hala hiyerarşide ise yukarıdaki adımları tekrarlayabilirsiniz, sadece UITableViewCell'e tıklamanız gerekir ve görünüm yeniden görünecektir.

İkinci yöntem UIViews için işe yarar, ancak UIToolbarlar için o kadar iyi değildir ve UIButtons için imkansızdır, bu nedenle birçok farklı alt görünüm eklemeniz gerektiğinde bulduğum en temiz çözüm, görünüm denetleyicinize bir kapsayıcı olarak tek bir ikincil UIView eklemektir. asla gösterilmez, tüm ikincil görünümlerinizi oraya koyun ve her şeyi görünür kılmak için UITableViewCell numarasını kullanın. Bunu görünmez yapmak için sahte UITableView'umu 0x0 olarak yeniden boyutlandırıyorum. İşte hepsinin birlikte nasıl göründüğünün bir ekran görüntüsü:

görüntü açıklamasını buraya girin


Mart 2013, bunu yapmama gerek yoktu - siyah çubuğu tamamen göz ardı etmelisiniz ve görünümünüzü doğrudan ana görünüme sürükleyip bırakmalısınız ve sorunsuz çalışıyor (Xcode 4.5+)
Adam

Bu özel uivew'i aynı ViewController'da yeniden kullanmak mümkün mü - Örn. iki özel uivews gerekli - Ve eğer öyleyse nasıl?
Morten Gustafsson

2
Dang, sadece ayrı bir xib oluşturmayı tercih ediyorum. Uygulamayı 6 ay içinde güncellemem gerektiğinde muhtemelen tüm bunları hatırlamayacağım.
Sandy

Bu harika bir cevap olsa da, yanlışlıkla daha iyi bir yol buldum. Çıkışları gerçek görünüm bileşenlerine bağlarken. Böyle bir iç görünümün bir bileşeninin biraz üzerine gelirseniz, daha kolay seçim için açılır. Sonra film şeridinde görüyorsunuz ...
Oded Ben Dov

7
Bu inanılmaz derecede takdire şayan bir tarihi cevap olsa da, gerçekten artık tamamen güncel değil. Apple, artık uygulamalar yaparken yaptığınız temel, temel şey olan "kapsayıcı görünümleri" ni tanıtarak tüm sorunu çözdü - her şey her zaman bir "kapsayıcı görünümü". Tanrıya şükür, artık çok kolay!
Şişko

11

Görüntü denetleyicilerinizi yalnızca başka yerde (ve hikaye panonuzda değil) yapmak istiyorsanız, bunu başarmanın oldukça basit bir yolu var:

1) oluştur CustomViewControllers ( abcdControllerbireysel ile denedim kodunda) xibher zamanki gibi s.

2) Hikaye panosuna bir UIViewController(veya üst sınıfınız neyse ) ekleyin CustomViewController.

3) için CustomClass ayarlama CustomViewControlleryerine UIViewController, burada gösterildiği gibi:

görüntü açıklamasını buraya girin

4) Sonunda, viewDidLoadözel olarak yükleyin xibve bitirdiniz.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
    // Do any additional setup after loading the view from its nib.
}

3
Çok ayrıntılı cevabınız için teşekkürler, ancak aslında özel bir görünüm denetleyicisi değil, standart bir UIViewController'a eklenen özel bir görünüm (bir pencere öğesi) arıyorum. Dolayısıyla sorun görüntü denetleyicisi değil, ancak özel widget'lar oluşturmak için en iyi yaklaşımın ne olduğunu merak ediyordum. Ya A) bunu daha önce yaptığım gibi bir .xib dosyasıyla ya da B) henüz bilmediğim başka bir yaklaşımla yap :-)
znq

1
Hmm ... Sanırım istediğini aldım. Temel olarak, aynı denetleyiciyle birden çok görünümü işlemek istiyorsunuz, değil mi? loadNibNamedBu durumda dışında bir yol düşünemiyorum ... XO
tipycalFlow

Bu benim için bu sorunu çözdü: stackoverflow.com/questions/11047991/… Ancak, viewDidLoad yerine loadView ... kullandım ...
Morkrom

1
Tekrarlamak gerekirse, kapsayıcı görünümleri geldiğine göre bunların hepsi (şükürler olsun!) Tamamen güncel değil. Bir konteynır görünümüne tıklayın ve her şey bitti
Şişko

1

Storyboard'dan belirli bir viewcontroller örneğini almak ve üzerinde görünümü kullanmak için böyle bir şey yapabileceğinizi düşünüyorum.

ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main"  bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.

Bu yardımcı olur umarım

Teşekkürler Vijay

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.