Tampilan Penampung dapat dengan mudah ditambahkan ke papan cerita melalui Editor Antarmuka. Saat ditambahkan, Tampilan Penampung adalah tampilan tempat penampung, segmen sematan, dan pengontrol tampilan (anak).
Namun, saya tidak dapat menemukan cara untuk menambahkan Tampilan Penampung secara terprogram. Sebenarnya, saya bahkan tidak dapat menemukan kelas bernama UIContainerView
atau lebih.
Nama untuk kelas Tampilan Penampung jelas merupakan awal yang baik. Panduan lengkap termasuk segue akan sangat dihargai.
Saya mengetahui Panduan Pemrograman Pengontrol Tampilan, tetapi saya tidak menganggapnya sama seperti yang dilakukan Pembuat Antarmuka untuk Penampil Penampung. Misalnya, ketika batasan disetel dengan benar, tampilan (anak) akan menyesuaikan dengan perubahan ukuran dalam Tampilan Penampung.
sumber
ViewController
siklus hidup tertanam .ViewController
Siklus hidup yang disematkan oleh Interface Builder adalah normal, tetapi yang ditambahkan secara terprogram memilikiviewDidAppear
, tidakviewWillAppear(_:)
jugaviewWillDisappear
.viewWillAppear
danviewWillDisappear
dipanggil pada pengontrol tampilan anak, baik-baik saja. Jika Anda memiliki contoh di mana mereka tidak, Anda harus mengklarifikasi, atau memposting pertanyaan Anda sendiri menanyakan mengapa mereka tidak.Jawaban:
Sebuah "tampilan kontainer" storyboard hanyalah
UIView
objek standar . Tidak ada jenis "tampilan penampung" khusus. Faktanya, jika Anda melihat hierarki tampilan, Anda dapat melihat bahwa "tampilan penampung" adalah standarUIView
:Untuk mencapai ini secara terprogram, Anda menggunakan "penahanan pengontrol tampilan":
instantiateViewController(withIdentifier:)
instance pengontrol tampilan anak dengan memanggil objek storyboard.addChild
pengontrol tampilan orang tua Anda.view
ke hierarki tampilan Anda denganaddSubview
(dan juga setelframe
batasan atau yang sesuai).didMove(toParent:)
metode pada pengontrol tampilan anak, dengan meneruskan referensi ke pengontrol tampilan induk.Lihat Menerapkan Pengontrol Tampilan Penampung di Panduan Pemrograman Pengontrol Tampilan dan bagian "Menerapkan Pengontrol Tampilan Penampung" dari Referensi Kelas UIViewController .
Misalnya, di Swift 4.2 akan terlihat seperti ini:
Perhatikan, hal di atas sebenarnya tidak menambahkan "tampilan container" ke hierarki. Jika Anda ingin melakukan itu, Anda akan melakukan sesuatu seperti:
Pola terakhir ini sangat berguna jika pernah bertransisi antara pengontrol tampilan anak yang berbeda dan Anda hanya ingin memastikan tampilan satu anak berada di lokasi yang sama dan tampilan anak sebelumnya (yaitu semua batasan unik untuk penempatan ditentukan oleh tampilan penampung, daripada perlu membangun kembali batasan ini setiap saat). Namun jika hanya melakukan penahanan tampilan sederhana, kebutuhan akan tampilan penampung terpisah ini kurang menarik.
Dalam contoh di atas, saya menetapkan sendiri
translatesAutosizingMaskIntoConstraints
untukfalse
menentukan batasan. Anda jelas dapat meninggalkantranslatesAutosizingMaskIntoConstraints
sebagaitrue
dan menyetelframe
danautosizingMask
untuk tampilan yang Anda tambahkan, jika Anda mau.Lihat revisi sebelumnya dari jawaban ini untuk membawakan Swift 3 dan Swift 2 .
sumber
ViewController
siklus hidup tertanam .ViewController
Siklus hidup yang disematkan oleh Interface Builder adalah normal, tetapi yang ditambahkan secara terprogram memilikiviewDidAppear
, tidakviewWillAppear(_:)
jugaviewWillDisappear
.ViewController
'sviewDidAppear
disebut dalam induknyaviewDidLoad
, bukan pada induknyaviewDidAppear
viewDidAppear
, [tetapi] tidakviewWillAppear(_:)
jugaviewWillDisappear
". Metodewill
muncul dipanggil dengan benar di kedua skenario. Seseorang harus menelepondidMove(toParentViewController:_)
ketika melakukannya secara terprogram, atau mereka tidak akan melakukannya. Mengenai waktu kemunculannya. metode, mereka dipanggil dalam urutan yang sama dua arah. Yang berbeda, adalah waktuviewDidLoad
, karena dengan embed, itu dimuat sebelumnyaparent.viewDidLoad
, tetapi dengan terprogram, seperti yang kita harapkan, itu terjadi selamaparent.viewLoadLoad
.translatesAutoresizingMaskIntoConstraints = false
. Saya tidak tahu mengapa itu diperlukan atau mengapa itu membuat semuanya berfungsi, tetapi terima kasih telah memasukkannya dalam jawaban Anda.@ Jawaban Rob di Swift 3:
sumber
Detail
Larutan
Pemakaian
Sampel lengkap
Hasil
sumber
tableViewController
dalamviewController
tetapi tidak bisa mengatur judul mantan. Saya tidak tahu apakah mungkin untuk melakukannya. Saya telah memposting pertanyaan ini . Anda baik jika melihatnya.Ini kode saya di swift 5.
}
Pemakaian
Gunakan fungsi sematan lainnya dengan pengontrol tampilan non-storyboard.
sumber
removeFromParent
mencegah panggilan Anda , bagaimana Anda akan mengubah kelas Anda untuk mengizinkan ini?