Analisis singkat dari contoh KVO
Saya mengalami masalah baru -baru ini. Beberapa iklan sangat nyaman untuk menempelkan logo mereka sendiri pada koordinat kepala, tetapi pada akhirnya, karena panjang komentar pada setiap halaman berbeda, koordinatnya juga berbeda, sehingga Anda tidak dapat memberikan koordinat mati untuk menempelkan logo. , Masalah ini diselesaikan dengan baik melalui KVO.
Ikhtisar @KVO:
KVO, yaitu, mengamati nilai kunci, memberikan mekanisme bahwa ketika atribut dari objek yang ditentukan dimodifikasi, objek akan diberitahu.
Sederhananya, setiap kali atribut dari objek yang diamati ditentukan dimodifikasi, KVO akan secara otomatis memberi tahu pengamat yang sesuai.
Langkah -langkah untuk digunakan adalah sebagai berikut:
1. Daftar, tentukan atribut pengamat,
2. Menerapkan metode panggilan balik
3. Metode Callback Memicu
4. Hapus pengamatan
Contoh Kode: Salin kode sebagai berikut:
-(void) viewDidload {
// kvo, sebagai pengamat, selama properti "konten" berubah, metode callback akan memberi tahu
[_WebView.ScrollView AddoBserver: Self ForkEyPath:@"ContentSize" Opsi: NSKeyValueObServingOptionNew Konteks: null];
}
// metode panggilan balik
- (void) ObserveValueForKePath: (NSString *) Keypath OfObject: (ID) Objek Perubahan: (nsdictionary *) Ubah konteks: (voidvoid *) konteks
{{
if (object == _webview.scrollview && [keypath isequeLtoString:@"contentSize"])
{{
// Dapatkan koordinat y maksimum
Cgsize size = _webview.scrollview.contentsize;
if (size.height> 568.0) {
// Blokir iklan
_hideBottomimage = [[uiMageView alloc] initwithFrame: cgrectmake (0, size.height-67, screenwidth, 67)];
_hideBottomimage.Image = [UIImage ImageNamed:@"Banner"];
[_WebView.ScrollView AddSubView: _HideBottomImage];
[_hidebottomimag rilis];
}
}
kalau tidak
{{
// panggil metode kelas induk
[Super ObserveValueForKEPath: keypath OfObject: Object Change: Ubah Konteks: Konteks];
}
}
-(void) Dealloc {// ---> Anda juga dapat memanggil metode Dealloc di lingkungan ARC, tetapi Anda tidak perlu menulis [Super Dealloc]
// Hapus KVO, jika tidak, itu akan menyebabkan kebocoran sumber daya
[_WebView.ScrollView RemoveObServer: Self ForkEyPath:@"ContentSize"];
[Super Dealloc];
}
Di atas adalah untuk properti konten, dan properti lainnya serupa.
Kvc
Biasanya, kita semua menetapkan dan mendapatkan nilai melalui set dan mendapatkan metode atribut. .
1. Metode Dasar (SetValue: Forkey: ValueForkey)
Salin kode kode sebagai berikut:
// --- Tentukan kelas siswa (tidak ada operasi pada file .m)
#import <foundation/foundation.h>
@Class HMTClass;
@Interface hmtstudent: nsObject {
Nsstring * _name;
Bool _test;
Bool _istest;
Tes bool;
Bool istest;
}
@property (nonatomik, salin) nsstring * nama;
@Property (nonatomik, salin) nsstring * sex;
@property (nonatomik, penugasan) usia nsinteger;
@property (nonatomik, kuat) hmtclass * hmtclass;
@akhir
// --- file utama
Hmtstudent * student = [[hmtstudent alloc] init];
student.hmtclass = [[hmtclass alloc] init];
Student.name = @"Humingtao";
// penugasan KVC
[Siswa SetValue:@"Mawei is Dog" forkey:@"name"];
[Siswa setValue:@"m" forkey:@"sex"];
[Siswa setValue:@(10) forkey:@"usia"];
// Dapatkan nilainya
Nslog (@"%s __%d__ |%@", __ function __, __ line __, [Student ValueForKey:@"name"]);
Perhatian Khusus:
Saya juga mendefinisikan 4 variabel nilai bool di kelas untuk memverifikasi urutan tombol atribut akses KVC
[Siswa setValue:@(ya) forkey:@"test"];
Hasilnya adalah: _test -> _ iStest -> test -> iStest
2. Akses Path Key (Digunakan untuk Mengaitkan SetValue: ForkEypath: ForkEypath)
Salin kode kode sebagai berikut:
// Buat kelas kelas
@Interface HMTClass: NSObject
@property (nonatomik, salin) nsstring * nama;
@akhir
Kemudian pada poin pertama di atas, atribut kelas HMTClass ditulis di kelas siswa.
Salin kode kode sebagai berikut:
Hmtclass *hmtclass = [[hmtclass alloc] init];
[hmtclass setValue:@"Cosmic Class 1" Forkey:@"Name"];
[Siswa setValue: hmtclass forkey:@"hmtclass"];
Nsstring *hmtclassname = [valueForKEyPath:@"hmtclass.name"];
// Anda dapat menyimpan nilainya seperti ini
[Siswa SetValue:@"Cosmic Class 1" ForkEypath:@"hmtclass.name"];
student.hmtclass.name = [Siswa ValueForKeYPath:@"HMTClass.Name"];
3. Secara otomatis merangkum tipe data dasar.
Salin kode kode sebagai berikut:
#import <foundation/foundation.h>
@Class HMTClass;
@Interface hmtstudent: nsObject
{{
Nsstring *_name;
Nomor nsinteger;
}
@akhir
[Siswa SetValue:@"100" FORKEYPATH:@"Number"];
Nsstring *number = [valueforkey siswa:@"nomor"];
Dapat dilihat bahwa nilai atribut yang ditetapkan dengan nsstring* type @"100", dan atribut kami adalah tipe nsinteger, jadi tidak ada masalah dengan akses.
4. Tambahkan array nsarray ke kelas siswa untuk mewakili siswa lain.
Salin kode kode sebagai berikut:
#import <foundation/foundation.h>
@Class HMTClass;
@Interface hmtstudent: nsObject
{{
Nsarray *banyak orang;
}
@akhir
Siswa *Student1 = [[hmtstudent alloc] init];
Siswa *Student2 = [[hmtstudent alloc] init];
Siswa *Student3 = [[hmtstudent alloc] init];
[Student1 setValue:@"200" forkey:@"number"];
[Student2 setValue:@"300" forkey:@"number"];
[Student3 setValue:@"400" forkey:@"number"];
Nsarray *array = [nsarray arraywithObjects: student1, student2, student3, nil];
[Siswa setValue: array forkey:@"manystudents"];
Nslog (@"%@", [ValueForKeypath:@"Manystudents.number"]);
Dicetak adalah array (200.300.400)