Saya sadar pertanyaan ini telah ditanyakan sebelumnya tetapi jawabannya bertentangan dan saya bingung, jadi tolong jangan nyalakan saya.
Saya ingin memiliki UIView
subclass yang dapat digunakan kembali di seluruh aplikasi saya. Saya ingin menjelaskan antarmuka menggunakan file pena.
Sekarang katakanlah itu adalah tampilan indikator pemuatan dengan indikator aktivitas di dalamnya. Saya ingin pada beberapa acara untuk membuat contoh tampilan ini dan menganimasikan ke tampilan pengontrol tampilan. Saya bisa menggambarkan antarmuka tampilan tanpa masalah secara terprogram, membuat elemen secara terprogram dan mengatur bingkai mereka di dalam metode init, dll.
Bagaimana saya bisa melakukan ini menggunakan pena? Mempertahankan ukuran yang diberikan dalam pembuat antarmuka tanpa harus menyetel bingkai.
Saya telah berhasil melakukannya seperti ini, tetapi saya yakin itu salah (ini hanya tampilan dengan picker di dalamnya):
- (id)initWithDataSource:(NSDictionary *)dataSource {
self = [super init];
if (self){
self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", [self class]] owner:self options:nil] objectAtIndex:0];
self.pickerViewData = dataSource;
[self configurePickerView];
}
return self;
}
Tapi saya menimpa diri sendiri, dan ketika saya memberi contoh:
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
Saya harus mengatur frame secara manual daripada mengambilnya dari IB.
EDIT: Saya ingin membuat tampilan kustom ini dalam pengontrol tampilan, dan memiliki akses untuk mengontrol elemen tampilan. Saya tidak ingin pengontrol tampilan baru.
Terima kasih
EDIT: Saya tidak tahu apakah ini praktik terbaik, saya yakin tidak, tapi beginilah cara saya melakukannya:
FSASelectView *selectView = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@",[FSASelectView class]] owner:self options:nil] objectAtIndex:0];
selectView.delegate = self;
[selectView configurePickerViewWithData:ds];
selectView.frame = CGRectMake(0, self.view.bottom + 50, selectView.width, selectView.height);
selectView.alpha = 0.9;
[self.view addSubview:selectView];
[UIView animateWithDuration: 0.25 delay: 0 options:UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveEaseInOut animations:^{
selectView.frame = CGRectMake(0, self.view.bottom - selectView.height, selectView.width, selectView.height);
selectView.alpha = 1;
} completion:^(BOOL finished) {
}];
Praktek yang benar masih dibutuhkan
Haruskah ini dilakukan dengan menggunakan pengontrol tampilan dan init dengan nama pena? Haruskah saya menyetel ujung pena dalam beberapa metode inisialisasi UIView dalam kode? Atau apa yang telah saya lakukan baik-baik saja?
initWithDataSource
? Bagaimanapun ini akan berhasil bahkan jika Anda memberi pemilik sebagai 'Nihil'.Jawaban:
Saya menggunakan ini untuk menginisialisasi tampilan kustom yang dapat digunakan kembali yang saya miliki.
Perhatikan bahwa Anda dapat menggunakan "firstObject" di bagian akhir, ini sedikit lebih bersih. "firstObject" adalah metode praktis untuk NSArray dan NSMutableArray.
Berikut adalah contoh umum, memuat xib untuk digunakan sebagai header tabel. Di file Anda YourClass.m
Biasanya, di
TopArea.xib
, Anda akan mengklik Pemilik File dan mengatur pemilik file ke KelasAnda . Kemudian sebenarnya di YourClass.h Anda akan memiliki properti IBOutlet. DiTopArea.xib
, Anda dapat menyeret kontrol ke outlet tersebut.Jangan lupa
TopArea.xib
, Anda mungkin harus mengklik Tampilan itu sendiri dan menyeretnya ke beberapa outlet, jadi Anda memiliki kendali atasnya, jika perlu. (Tip yang sangat berharga adalah ketika Anda melakukan ini untuk baris sel tabel, Anda benar-benar harus melakukannya - Anda harus menghubungkan tampilan itu sendiri ke properti yang relevan dalam kode Anda.)sumber
Jika Anda ingin menjaga Anda
CustomView
dan yangxib
independenFile's Owner
, kemudian ikuti langkah-langkah iniFile's Owner
bidang kosong.xib
file AndaCustomView
dan tetapkanCustom Class
sebagaiCustomView
(nama kelas tampilan kustom Anda)IBOutlet
dalam.h
file tampilan kustom Anda..xib
file tampilan kustom Anda, klik pada tampilan dan masukConnection Inspector
. Di sini Anda akan melihat semua IBOutlet Anda yang Anda tentukan dalam.h
filedalam
.m
fileCustomView
kelas Anda , gantiinit
metode sebagai berikutSekarang ketika Anda ingin memuat Anda
CustomView
, gunakan baris kode berikut[[CustomView alloc] init];
sumber
-init
. Sebaliknya itu akan memanggilinitWithFrame:
dan-awakeFromNib
. Jika Anda menulis kode yang sama untuk memuat tampilan Anda seperti dalam-init
metode, Anda akan memasuki loop tak terbatas.Ikuti langkah-langkah berikut ini
UIView
.MyView.xib
.UIViewController
dariNSObject
dalam xib. Lihat gambar di bawahHubungkan Tampilan Pemilik File ke Tampilan Anda. Lihat gambar di bawah
Ubah kelas View Anda menjadi
MyView
. Sama seperti 3.Berikut kode untuk memuat View:
Semoga membantu.
Klarifikasi :
UIViewController
digunakan untuk memuat xib Anda dan Tampilan yangUIViewController
sebenarnyaMyView
telah Anda tetapkan di xib MyView ..Demo Saya telah membuat demo ambil di sini
sumber
Menjawab pertanyaan saya sendiri sekitar 2 tahun kemudian di sini tapi ...
Ini menggunakan ekstensi protokol sehingga Anda dapat melakukannya tanpa kode tambahan untuk semua kelas.
sumber
Di Swift:
Misalnya, nama kelas khusus Anda adalah
InfoView
Pertama, Anda membuat file
InfoView.xib
danInfoView.swift
menyukai ini:Kemudian mengatur
File's Owner
untukUIViewController
seperti ini:Ubah nama Anda
View
menjadiInfoView
:Klik kanan ke
File's Owner
dan hubungkanview
bidang Anda denganInfoView
:Pastikan bahwa nama kelas adalah
InfoView
:Dan setelah ini Anda dapat menambahkan tombol tindakan ke di kelas khusus Anda tanpa masalah:
Dan penggunaan kelas khusus ini di
MainViewController
:sumber
Anda juga bisa menginisialisasi xib menggunakan pengontrol tampilan dan menggunakan viewController.view. atau lakukan seperti yang Anda lakukan. Hanya membuat
UIView
subclass sebagai pengontrolnyaUIView
adalah ide yang buruk.Jika Anda tidak memiliki outlet dari tampilan kustom Anda, maka Anda dapat langsung menggunakan
UIViewController
kelas untuk menginisialisasi.Pembaruan: Dalam kasus Anda:
Jika tidak, Anda harus membuat kebiasaan
UIViewController
(untuk menjadikannya sebagai pemilik file sehingga outlet terhubung dengan benar).Dimanapun Anda ingin menambahkan tampilan yang dapat Anda gunakan.
Namun melewatkan pengontrol tampilan lain (sudah digunakan untuk tampilan lain) sebagai pemilik saat memuat xib bukanlah ide yang baik karena properti tampilan pengontrol akan diubah dan ketika Anda ingin mengakses tampilan asli, Anda tidak akan punya referensi untuk itu.
EDIT: Anda akan menghadapi masalah ini jika Anda telah menyiapkan xib baru Anda dengan pemilik file sebagai
UIViewController
kelas utama yang sama dan mengikat properti tampilan ke tampilan xib baru.yaitu;
Kode di bawah ini akan menyebabkan kebingungan di kemudian hari, jika Anda menulisnya di dalam tampilan tidak dimuat
YourMainViewController
. Itu karenaself.view
mulai saat ini akan merujuk ke customview Andasumber