تحليل موجز لأمثلة KVO
لقد واجهت مشكلة مؤخرًا. . ، يتم حل هذه المشكلة بشكل جيد من خلال KVO.
نظرة عامة على KVO:
KVO ، أي مراقبة القيمة الرئيسية ، فإنه يوفر آلية أنه عند تعديل سمات الكائن المحدد ، سيتم إخطار الكائن.
ببساطة ، في كل مرة يتم تعديل سمات الكائن المرصود المحدد ، ستقوم KVO تلقائيًا بإخطار المراقب المقابل.
خطوات الاستخدام هي كما يلي:
1. سجل ، حدد سمات المراقب ،
2. تنفيذ طريقة رد الاتصال
3. طريقة رد الاتصال
4. إزالة الملاحظة
مثال الرمز: انسخ الرمز كما يلي:
-(void) viewDidload {
// kvo ، كمراقب ، طالما أن العقار "يضم" تغييرات ، فإن طريقة رد الاتصال سوف تخطر
[_webview.scrollview addobserver: self forkeypath:@"contentsize" خيارات: nskeyvalueObservingOptionNew السياق: null] ؛
}
// طريقة رد الاتصال
- (void) observevalueforkeypath: (NSString *) Keypath ofObject: (id) تغيير الكائن: (nsdictionary *) تغيير السياق: (voidvoid *) سياق
{{
if (object == _webview.scrollview && [keypath isequaltostring:@"contentsize"]
{{
// احصل على أقصى إحداثي y
حجم cgsize = _webview.scrollview.contentsize ؛
if (size.height> 568.0) {
// كتلة الإعلانات
_hidebottomImage = [[uiimageview incloc] initWithFrame: cgrectmake (0 ، size.height-67 ، screenwidth ، 67)] ؛
_hidebottomImage.image = [uiimage ImageNamed:@"banner"] ؛
[_webview.scrollview AddSubview: _HidebottomImage] ؛
[_HidebottomImag release] ؛
}
}
آخر
{{
// استدعاء طريقة الفئة الأصل
[Super ObserveValueForKeypath: Keypath ofObject: تغيير الكائن: تغيير السياق: السياق] ؛
}
}
-(void) Dealloc {// ---> يمكنك أيضًا استدعاء طريقة Dealloc في بيئة ARC ، لكنك لست بحاجة إلى الكتابة [Super Dealloc]
// إزالة KVO ، وإلا فإنه سيؤدي إلى تسرب الموارد
[_webview.scrollview removeObserver: self forkeypath:@"contentsize"] ؛
[Super Dealloc] ؛
}
ما ورد أعلاه هو خاصية Contentsize ، والممتلكات الأخرى متشابهة.
KVC
عادةً ما نقوم بتعيين القيم ونحصل عليها من خلال مجموعة السمات. .
1. الطريقة الأساسية (setValue: forkey: valueforkey)
نسخ رمز رمز على النحو التالي:
// --- حدد فصل الطالب (لا توجد عملية على ملف .m)
#Import <Foundation/Foundation.h>
class hmtclass ؛
interface hmtstudent: nsobject {
NSString * _name ؛
Bool _test ؛
Bool _istest ؛
اختبار منطقي
بول istest.
}
property (nonatomic ، copy) nsstring * name ؛
property (nonatomic ، نسخة) nsstring * الجنس ؛
@property (nonatomic ، issign) nsinteger age ؛
property (nonatomic ، قوية) hmtclass * hmtclass ؛
@نهاية
// --- الملف الرئيسي
hmtstudent * student = [[hmtstudent init] init] ؛
student.hmtclass = [[hmtclass init] init] ؛
student.name = @"Humingtao" ؛
// kvc التعيين
[setValue student:@"mawei is dog" forkey:@"name"] ؛
[الطالب setValue:@"m" forkey:@"sex"] ؛
[SetValue الطالب:@(10) forkey:@"Age"] ؛
// احصل على القيمة
nslog (@"٪ s __ ٪ d__ | ٪@" ، __ function __ ، __ line __ ، [student valueforkey:@"name"]) ؛
اهتمام خاص:
لقد حددت أيضًا 4 متغيرات قيمة منطقية في الفصل للتحقق من ترتيب مفاتيح سمة الوصول إلى KVC
[setValue student:@(نعم) forkey:@"test"] ؛
والنتيجة هي: _test -> _ istest―> test―> istest
2. الوصول إلى مسار المفاتيح (يستخدم في السمة setValue: forkeypath: forkeypath)
نسخ رمز رمز على النحو التالي:
// إنشاء فصل دراسي
interface hmtclass: nsobject
property (nonatomic ، copy) nsstring * name ؛
@نهاية
ثم في النقطة الأولى أعلاه ، تتم كتابة سمة الفصل hmtclass في فصل الطلاب.
نسخ رمز رمز على النحو التالي:
hmtclass *hmtclass = [[hmtclass incloc] init] ؛
[hmtclass setValue:@"cosmic class 1" forKey:@"name"] ؛
[setValue student: hmtclass forkey:@"hmtclass"] ؛
NSString *hmtclassName = [الطالب valueforkeypath:@"hmtclass.name"] ؛
// يمكنك حفظ القيمة مثل هذه
[setValue student:@"cosmic class 1" forkeypath:@"hmtclass.name"] ؛
student.hmtclass.name = [student valueforkeypath:@"hmtclass.name"] ؛
3. تغليف أنواع البيانات الأساسية تلقائيًا.
نسخ رمز رمز على النحو التالي:
#Import <Foundation/Foundation.h>
class hmtclass ؛
interface hmtstudent: nsobject
{{
NSString *_name ؛
رقم nsinteger ؛
}
@نهاية
[Setvalue Student:@"100" forkeypath:@"number"] ؛
NSString *number = [student valueforkey:@"number"] ؛
يمكن ملاحظة أن قيمة قيمة السمة مع NSString* type @"100" ، وسمتنا من نوع nsinteger ، لذلك لا توجد مشكلة في الوصول.
4. أضف صفيف nsarray إلى فصل الطلاب لتمثيل الطلاب الآخرين.
نسخ رمز رمز على النحو التالي:
#Import <Foundation/Foundation.h>
class hmtclass ؛
interface hmtstudent: nsobject
{{
nsarray *mustudents ؛
}
@نهاية
الطالب *student1 = [[hmtstudent init] init] ؛
الطالب *student2 = [[hmtstudent init] init] ؛
الطالب *student3 = [[hmtstudent init] init] ؛
[STUTTER1 SETVALUE:@"200" forkey:@"number"] ؛
[STUTTER2 SETVALUE:@"300" forKey:@"number"] ؛
[STUTTER3 SETVALUE:@"400" forkey:@"number"] ؛
nsarray *array = [nsarray arraywithobjects: student1 ، student2 ، student3 ، nil] ؛
[SetValue الطالب: Array Forkey:@"ManyStudents"] ؛
nslog (@"٪@" ، [student valueforkeypath:@"manyStudents.number"]) ؛
المطبوعة Out هي صفيف (200300،400)