Saat ini saya membuat aplikasi yang akan memiliki banyak timer, yang pada dasarnya semuanya sama.
Saya ingin membuat kelas khusus yang menggunakan semua kode untuk pengatur waktu serta tata letak / animasi, jadi saya dapat memiliki 5 pengatur waktu identik yang beroperasi secara independen satu sama lain.
Saya membuat tata letak menggunakan IB (xcode 4.2) dan semua kode untuk pengatur waktu saat ini hanya di kelas viewcontroller.
Saya mengalami kesulitan membungkus otak saya tentang cara merangkum semuanya ke dalam kelas khusus dan kemudian menambahkannya ke viewcontroller, bantuan apa pun akan sangat dihargai.
UITableViewCell
atauUICollectionViewCell
. Dalam kasus saya, saya memerlukan tampilan kecil namun cukup kompleks yang dapat saya gunakan berkali-kali dalam tampilan pengontrol dan koleksi. Dan para desainer terus mengerjakannya kembali, jadi saya ingin satu tempat untuk menentukan tata letak. Oleh karena itu, sebuah ujung pena.Jawaban:
Nah untuk menjawab secara konseptual, pengatur waktu Anda kemungkinan besar harus menjadi subkelas,
UIView
bukanNSObject
.Untuk membuat instance dari
UIView
pengatur waktu Anda di IB cukup seret dan letakkan di tampilan pengontrol tampilan Anda, dan setel kelasnya ke nama kelas pengatur waktu Anda.Ingat
#import
kelas pengatur waktu di pengontrol tampilan Anda.Sunting: untuk desain IB (untuk contoh kode lihat riwayat revisi)
Saya sama sekali tidak begitu paham dengan storyboard, tetapi saya tahu bahwa Anda dapat membuat antarmuka Anda di IB menggunakan
.xib
file yang hampir identik dengan versi storyboard; Anda bahkan harus dapat menyalin & menempel tampilan Anda secara keseluruhan dari antarmuka yang ada ke.xib
file.Untuk menguji ini saya membuat kosong baru
.xib
bernama "MyCustomTimerView.xib". Kemudian saya menambahkan tampilan, dan untuk itu menambahkan label dan dua tombol. Seperti Jadi:Saya membuat subclassing kelas tujuan-C baru
UIView
bernama "MyCustomTimer". Di kelas saya,.xib
saya menetapkan kelas Pemilik File menjadi MyCustomTimer . Sekarang saya bebas untuk menghubungkan tindakan dan outlet seperti tampilan / pengontrol lainnya. File yang dihasilkan.h
terlihat seperti ini:Satu-satunya rintangan yang tersisa untuk dilompati adalah mendapatkan ini
.xib
diUIView
subkelas saya . Menggunakan secara.xib
dramatis mengurangi pengaturan yang diperlukan. Dan karena Anda menggunakan papan cerita untuk memuat pengatur waktu, kami tahu-(id)initWithCoder:
bahwa satu-satunya penginisialisasi yang akan dipanggil. Jadi seperti inilah file implementasinya:Metode bernama
loadNibNamed:owner:options:
melakukan persis seperti namanya. Ini memuat Nib dan menetapkan properti "Pemilik File" ke dirinya sendiri. Kami mengekstrak objek pertama dalam array dan itu adalah tampilan root dari Nib. Kami menambahkan tampilan sebagai subview dan Voila itu di layar.Jelas ini hanya mengubah warna latar belakang label saat tombol ditekan, tetapi contoh ini akan membantu Anda.
Catatan berdasarkan komentar:
Perlu dicatat bahwa jika Anda mendapatkan masalah rekursi tak terbatas, Anda mungkin melewatkan trik halus dari solusi ini. Itu tidak melakukan apa yang Anda pikir dilakukannya. Tampilan yang diletakkan di storyboard tidak terlihat, melainkan memuat tampilan lain sebagai subview. Tampilan yang dimuatnya adalah tampilan yang ditentukan di ujung pena. "Pemilik file" di ujung pena adalah tampilan yang tak terlihat itu. Bagian yang keren adalah bahwa tampilan tak terlihat ini masih merupakan kelas Objective-C yang dapat digunakan sebagai semacam pengontrol tampilan untuk tampilan yang dibawa dari ujung pena. Misalnya,
IBAction
metode diMyCustomTimer
kelas adalah sesuatu yang Anda harapkan lebih banyak di pengontrol tampilan daripada di tampilan.Sebagai catatan tambahan, beberapa orang mungkin berpendapat bahwa ini rusak
MVC
dan saya agak setuju. Dari sudut pandang saya, ini lebih terkait dengan kebiasaanUITableViewCell
, yang terkadang juga harus menjadi pengontrol bagian.Perlu juga dicatat bahwa jawaban ini memberikan solusi yang sangat spesifik; buat satu ujung yang bisa dibuat instance-nya beberapa kali pada tampilan yang sama seperti yang ditata di papan cerita. Misalnya, Anda dapat dengan mudah membayangkan enam dari pengatur waktu ini semuanya di layar iPad sekaligus. Jika Anda hanya perlu menentukan tampilan untuk pengontrol tampilan yang akan digunakan beberapa kali di seluruh aplikasi Anda, maka solusi yang diberikan oleh jyavenard untuk pertanyaan ini hampir pasti merupakan solusi yang lebih baik untuk Anda.
sumber
userInfo
properti pada pemberitahuan@property(nonatomic,copy) NSDictionary *userInfo;
File's Owner
disetel ke nama kelas Anda memecahkan masalah rekursi tak terbatas saya.[self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"MyCustomTimerView" owner:self options:nil] objectAtIndex:0]];
Menambahkan UIView Kedua ... Ini agak terlihat aneh bagi saya tidak ada orang lain yang merasakan hal yang sama? Jika demikian, apakah ini sesuatu yang dibuat dengan sengaja oleh apel? Atau apakah solusi yang ditemukan seseorang dengan melakukan ini?Contoh cepat
Diperbarui untuk Xcode 10 dan Swift 4
Berikut ini panduan dasar. Saya awalnya belajar banyak tentang ini dari menonton serial video Youtube ini . Kemudian saya memperbarui jawaban saya berdasarkan artikel ini .
Tambahkan file tampilan kustom
Dua file berikut akan membentuk tampilan kustom Anda:
UIView
subclassDetail untuk menambahkannya ada di bawah.
File Xib
Tambahkan file .xib ke proyek Anda (File> New> File ...> User Interface> View) . Saya menelepon milik saya
ReusableCustomView.xib
.Buat tata letak yang Anda inginkan untuk tampilan kustom Anda. Sebagai contoh, saya akan membuat layout dengan a
UILabel
dan aUIButton
. Merupakan ide yang baik untuk menggunakan tata letak otomatis sehingga segala sesuatunya akan berubah ukuran secara otomatis tidak peduli berapa ukuran yang Anda atur nanti. (Saya menggunakan Bentuk Bebas untuk ukuran xib di inspektur Atribut sehingga saya dapat menyesuaikan metrik yang disimulasikan, tetapi ini tidak perlu.)File cepat
Tambahkan file .swift ke proyek Anda (File> New> File ...> Source> Swift File) . Ini adalah subkelas dari
UIView
dan saya memanggil milik sayaReusableCustomView.swift
.Jadikan file Swift sebagai pemiliknya
Kembali ke file .xib Anda dan klik "Pemilik File" di Garis Besar Dokumen. Di Identity Inspector, tulis nama file .swift Anda sebagai nama kelas kustom.
Tambahkan Kode Tampilan Kustom
Ganti konten
ReusableCustomView.swift
file dengan kode berikut:Pastikan untuk mendapatkan ejaan yang tepat untuk nama file .xib Anda.
Hubungkan Outlet dan Tindakan
Hubungkan outlet dan tindakan dengan kontrol menyeret dari label dan tombol di tata letak xib ke kode tampilan kustom cepat.
Gunakan tampilan kustom Anda
Tampilan kustom Anda sudah selesai sekarang. Yang harus Anda lakukan adalah menambahkan apa
UIView
pun yang Anda inginkan di storyboard utama Anda. Tetapkan nama kelas tampilanReusableCustomView
di Identity Inspector.sumber
Bundle.main
keBundle(for: ...)
melakukan triknya. Rupanya,Bundle.main
tidak tersedia pada waktu desain.init(frame:)
. Setelah Anda menambahkan ini (dan menarik semua kode inisialisasi ke dalam beberapacommonInit()
fungsi), ini berfungsi dengan baik dan ditampilkan di IB. Lihat info lebih lanjut di sini: stackoverflow.com/questions/31265906/…Jawaban untuk pengontrol tampilan, bukan tampilan :
Ada cara yang lebih mudah untuk memuat xib dari storyboard. Katakanlah pengontrol Anda adalah jenis MyClassController yang diwarisi dari
UIViewController
.Anda menambahkan
UIViewController
menggunakan IB di storyboard Anda; ubah tipe kelas menjadi MyClassController. Hapus tampilan yang telah ditambahkan secara otomatis di storyboard.Pastikan XIB yang ingin Anda panggil disebut MyClassController.xib.
Saat kelas akan dibuat instance-nya selama pemuatan storyboard, xib akan dimuat secara otomatis. Alasan untuk ini adalah karena implementasi default
UIViewController
yang memanggil XIB yang dinamai dengan nama kelas.sumber
'Could not load NIB in bundle: 'NSBundle </Users/me/.../MyAppName.app> (loaded)' with name 'uB0-aR-WjG-view-4OA-9v-tyV''
. Perhatikan whacko nibName. Saya menggunakan nama kelas yang benar untuk di ujung pena.Ini sebenarnya bukan jawaban, tetapi saya pikir akan sangat membantu untuk membagikan pendekatan ini.
Objective-C
Cepat
Pilihan :
Itu saja, sekarang Anda dapat menambahkan tampilan kustom Anda ke storyboard Anda dan itu akan ditampilkan :)
CustomViewWithXib.h :
CustomViewWithXib.m :
CustomViewWithXib.swift :
Anda dapat menemukan beberapa contoh di sini .
Semoga membantu.
sumber