iOS İç İçe Görünüm Denetleyicileri, UIViewController görünümünün içinde görünüyor mu?


91

UIViewController görünümünde iç içe geçmiş bir görünüm denetleyicisinin görünümüne sahip olmak iOS'ta genellikle kötü programlama uygulaması mıdır? Örneğin, kullanıcının dokunuşlarına yanıt veren, ancak ekranın yalnızca% 25'ini kaplayan bir tür etkileşimli öğeye sahip olmak istediğimi varsayalım.

Sanırım bu yuvalanmış görünüm denetleyicisini UIViewController'ıma şöyle bir şey söyleyerek ekleyecektim:

[self.view addSubview: nestedViewController.view];

6
İşte çok sayıda resim içeren tam bir eğitim! stackoverflow.com/a/23403979/294884 Keyfini çıkarın
Fattie

Yanıtlar:


148

Hayır, bu genellikle iyi bir tasarımdır, görünüm denetleyicilerinizin kısa ve öz tutulmasına yardımcı olur. Bununla birlikte, görünüm denetleyicisi sınırlama modelini kullanmanız gerekir, aşağıdaki belgelere bir göz atın.

Container View Controller'ı Uygulama

Bu, Storyboard'lar ile Interface Builder'ı kullanarak kurulumu inanılmaz derecede basittir, nesne kitaplığındaki Konteyner Görünümü'ne bir göz atın.

İşte bir Storyboard'daki uydurma bir örnek. Bu örnekte, biri 3 kabı tutan ve her kap için bir tane olmak üzere 4 görüntü denetleyiciniz olacaktır. Eğer konteynerlerin hepsi var en soldaki denetleyici sunduğumuz zaman, Storyboard otomatik ilklendir ve Sen yoluyla bu çocuk görünümü denetleyicileri erişebilir diğer 3. katıştıracaksınız childViewControllersmülkiyet veya geçersiz kılabilirsiniz bir yöntem yoktur prepareForSegue:sender:ve hedef görünümü denetleyicileri yakalamak Segue çağrılmak üzere. Bu ayrıca, gerekirse alt görünüm denetleyicilerine özellikleri geçirmek için iyi bir noktadır.

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


42
bunu film şeridinde nasıl "lanet" yapıyorsun? bu basit bir soru .. Cevabını bilmiyorum :) İç çek - kendi sorumu cevaplıyorum. Sahneye bir kap ekleyin . Şekillendir. Ardından film şeridinin boş alanlarında bir UIViewController yapın. Ardından, bu konteynerden (Navigator listesinde veya GUI'de) bu yeni UIViewController'a sağ tıklayıp sürükleyin. Başlamak için açılır pencereden viewDidLoad-embed öğesini seçin. Teşekkürler Chris! :)
fattie

Bu arada bağlantı koptu.
Benjohn

2
@JoeBlow +1 "viewDidLoad-embed" Kutsal inek: Bunu kim tahmin edebilirdi!
Drux

Teşekkürler @ChrisWagner! Bu, MVVM mimarisini uygulamak ve Massive View Controller / "MVC" 'den kaçınmak için bulmacanın kritik bir parçasıdır)
Rob

54

Bu kodu üst görüntü denetleyicisine koydum. Benim için harika çalışıyor.

Obj C

-(void)viewDidLoad{
     [super viewDidLoad];
     InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
     [self addChildViewController:innerViewController];
     [self.view addSubview:innerViewController.view];
     [innerViewController didMoveToParentViewController:self];
}

Swift :

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

Diğer bir seçenek de IB'yi kullanmak ve konteyner görünümü koymaktır. UIViewController otomatik olarak görünecektir (bu durumda XCode 9): görüntü açıklamasını buraya girin


2
Evet! +1. :) Bu programlama yoluyla nasıl bir cevap da dahil için teşekkürler
C. Tewalt

Görünümü alt görünüm denetleyicisinden üst alt görünüm listesine sürükleyip bıraktım.
dimpiax

5

İşte Swift Developers On FB'nin cevabına dayanan Swift 3 çözümüm

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
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.