Tampilan Pengontrol Tampilan Bersarang iOS di dalam tampilan UIViewController?


90

Apakah biasanya praktik pemrograman yang buruk di iOS memiliki tampilan pengontrol tampilan bersarang di dalam tampilan UIViewController? Katakanlah misalnya saya ingin memiliki beberapa jenis elemen interaktif yang merespons sentuhan pengguna, tetapi mungkin hanya menempati 25% dari layar.

Saya kira saya akan menambahkan pengontrol tampilan bersarang ini ke UIViewController saya dengan mengatakan sesuatu seperti:

[self.view addSubview: nestedViewController.view];

6
Berikut tutorial lengkap dengan banyak gambar !! stackoverflow.com/a/23403979/294884 Nikmati
Fattie

Jawaban:


148

Tidak, ini umumnya desain yang bagus, ini membantu pengontrol tampilan Anda tetap ringkas. Namun Anda harus menggunakan pola penahanan pengontrol tampilan, lihat dokumentasi berikut.

Menerapkan Pengontrol Tampilan Penampung

Ini sangat mudah untuk disiapkan menggunakan Pembuat Antarmuka dengan Papan Cerita juga, lihat Tampilan Penampung di pustaka objek.

Berikut adalah contoh yang dibuat-buat di Storyboard. Dalam contoh ini Anda akan memiliki 4 pengontrol tampilan, satu yang menampung 3 kontainer, dan satu untuk setiap kontainer. Saat Anda menampilkan pengontrol paling kiri yang memiliki semua container, Storyboard akan secara otomatis menginisialisasi dan menyematkan 3. lainnya. Anda dapat mengakses pengontrol tampilan anak ini melalui childViewControllersproperti atau ada metode yang dapat Anda timpa prepareForSegue:sender:dan menangkap pengontrol tampilan tujuan segue akan dipanggil. Ini juga merupakan titik yang baik untuk meneruskan properti ke pengontrol tampilan anak jika diperlukan.

masukkan deskripsi gambar di sini


42
bagaimana "sih" kamu melakukan itu di storyboard ?! itu pertanyaan dasar .. Saya tidak tahu jawabannya :) Sigh - menjawab pertanyaan saya sendiri. Tambahkan wadah ke tempat kejadian. Bentuk itu. Kemudian di bidang kosong storyboard buatlah UIViewController. Kemudian klik kanan-seret dari wadah itu (baik di daftar Navigator atau GUI) ke UIViewController baru itu. Dari munculan, pilih viewDidLoad-embed, untuk memulai. Terima kasih Chris! :)
Fattie

Omong-omong, tautan rusak.
Benjohn

2
@JoeBlow +1 "viewDidLoad-embed" Astaga: siapa sangka!
Drux

Terima kasih @ChrisWagner! Ini adalah bagian penting dari teka-teki untuk mengimplementasikan arsitektur MVVM dan menghindari Massive View Controller / "MVC";)
Rob

54

Saya meletakkan kode ini di pengontrol tampilan orang tua. Ini bekerja dengan baik untuk saya.

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)

Pilihan lainnya adalah dengan menggunakan IB dan meletakkan tampilan kontainer. UIViewController akan muncul secara otomatis (XCode 9 dalam kasus ini): masukkan deskripsi gambar di sini


2
Iya! +1. Terima kasih telah menyertakan jawaban untuk bagaimana melakukan ini secara terprogram :)
C. Tewalt

Saya baru saja menyeret & melepaskan tampilan dari pengontrol tampilan anak ke daftar subview induk.
dimpiax

5

Ini solusi Swift 3 saya berdasarkan jawaban Swift Developers On FB

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.