การวิเคราะห์สั้น ๆ ของตัวอย่าง KVO
ฉันได้พบปัญหาเมื่อเร็ว ๆ นี้ . โฆษณาบางอย่างสะดวกมากที่จะวางโลโก้ของตัวเองบนพิกัดหัว แต่ในตอนท้ายเนื่องจากความยาวของความคิดเห็นในแต่ละหน้าแตกต่างกันพิกัดก็แตกต่างกันดังนั้นคุณไม่สามารถให้พิกัดที่ตายแล้วเพื่อวางโลโก้ ปัญหานี้ได้รับการแก้ไขอย่างดีผ่าน KVO
@kvo ภาพรวม:
KVO นั่นคือการสังเกตค่าคีย์มันให้กลไกที่เมื่อคุณลักษณะของวัตถุที่ระบุได้รับการแก้ไขวัตถุจะได้รับแจ้ง
พูดง่ายๆว่าทุกครั้งที่แอตทริบิวต์ของวัตถุที่สังเกตได้รับการแก้ไขจะถูกแก้ไข KVO จะแจ้งผู้สังเกตการณ์ที่เกี่ยวข้องโดยอัตโนมัติ
ขั้นตอนการใช้งานมีดังนี้:
1. ลงทะเบียนระบุแอตทริบิวต์ของผู้สังเกตการณ์
2. ใช้วิธีการโทรกลับ
3. วิธีการโทรกลับทริกเกอร์
4. ลบการสังเกต
ตัวอย่างรหัส: คัดลอกรหัสดังนี้:
-(เป็นโมฆะ) ViewDidLoad {
// kvo ในฐานะผู้สังเกต
[_webview.scrollview addobserver: ตัวเลือก Self forkeypath:@"contentsize" ตัวเลือก: nskeyvalueobservingoptionnew บริบท: null];
-
// วิธีการโทรกลับ
- (เป็นโมฆะ) ObsiderEvalueForKeyPath: (NSSTRING *) KEYPATH OFOBJECT: (ID) การเปลี่ยนแปลงวัตถุ: (NSDICTIONARY *) เปลี่ยนบริบท: (voidVoid *) บริบท
-
if (object == _webView.scrollView && [KEYPATH ISEQUALTOSTRING:@"contentSize"]))
-
// รับพิกัดสูงสุด y
CGSize size = _webview.scrollview.contentsize;
if (size.height> 568.0) {
// บล็อกโฆษณา
_HideBottomImage = [[UIIMAGEVIEW alloc] initWithFrame: cGrectMake (0, size.Height-67, ScreenWidth, 67)];
_HideBottomImage.image = [uiimage imagenamed:@"แบนเนอร์"];
[_webview.scrollview addsubview: _hidebottomimage];
[_hidebottomimag release];
-
-
อื่น
-
// โทรหาวิธีการคลาสแม่
[Super NepowerEvalueForKeypath: KEYPATH OFOBJECT: การเปลี่ยนแปลงวัตถุ: เปลี่ยนบริบท: บริบท];
-
-
-(เป็นโมฆะ) DealLoc {// ---> คุณสามารถเรียกวิธีการจัดการในสภาพแวดล้อม ARC แต่คุณไม่จำเป็นต้องเขียน [Super DealLoc]
// ลบ KVO มิฉะนั้นจะทำให้ทรัพยากรรั่วไหล
[_webview.scrollView RemoveObserver: Self forkeypath:@"contentsize"];
[Super Dealloc];
-
ข้างต้นมีไว้สำหรับคุณสมบัติของสารบัญและคุณสมบัติอื่น ๆ จะคล้ายกัน
KVC
โดยปกติแล้วเราทุกคนกำหนดและรับค่าผ่านชุดและรับวิธีการของคุณลักษณะ .
1. วิธีพื้นฐาน (setValue: forkey: valueForkey)
คัดลอกรหัสรหัสดังนี้:
// --- กำหนดชั้นเรียนนักเรียน (ไม่มีการดำเนินการในไฟล์. m)
#import <foundation/foundation.h>
@class hmtclass;
@Interface hmtstudent: nsobject {
NSSTRING * _NAME;
บูล _test;
บูล _istest;
การทดสอบบูล;
บูล istest;
-
@Property (nonatomic, copy) nsstring * ชื่อ;
@Property (nonatomic, copy) nsstring * sex;
@Property (nonatomic, กำหนด) อายุ nsinteger;
@Property (nonatomic, strong) hmtclass * hmtclass;
@จบ
// --- ไฟล์หลัก
hmtstudent * student = [[hmtstudent alloc] init];
student.hmtclass = [[hmtclass alloc] init];
student.name = @"Humingtao";
// การมอบหมาย KVC
[นักเรียน setValue:@"mawei เป็นสุนัข" forkey:@"ชื่อ"];
[นักเรียน setValue:@"m" forkey:@"sex"];
[นักเรียน setValue:@(10) forkey:@"อายุ"];
// รับค่า
nslog (@"%s __%d__ |%@", __ ฟังก์ชั่น __, __ line __, [นักเรียน valueforkey:@"ชื่อ"]);
ความสนใจเป็นพิเศษ:
ฉันยังกำหนดตัวแปรค่าบูล 4 ตัวในคลาสเพื่อตรวจสอบลำดับของคีย์แอตทริบิวต์การเข้าถึง KVC
[นักเรียน setValue:@(ใช่) forkey:@"test"];
ผลลัพธ์คือ: _test -> _ istest -> ทดสอบ -> istest
2. การเข้าถึงเส้นทางคีย์ (ใช้เพื่อตั้งค่า SetValue: ForKeyPath: ForKeyPath)
คัดลอกรหัสรหัสดังนี้:
// สร้างคลาสคลาส
@Interface hmtclass: nsobject
@Property (nonatomic, copy) nsstring * ชื่อ;
@จบ
จากนั้นในจุดแรกด้านบนแอตทริบิวต์คลาส HMTCLASS จะถูกเขียนขึ้นในชั้นเรียนของนักเรียน
คัดลอกรหัสรหัสดังนี้:
hmtclass *hmtclass = [[hmtclass alloc] init];
[hmtclass setValue:@"cosmic class 1" forkey:@"name"];
[นักเรียน setValue: hmtclass forkey:@"hmtclass"];
NSSTRING *HMTCLASSNAME = [นักเรียน ValueForKeyPath:@"hmtclass.name"];
// คุณสามารถบันทึกค่าเช่นนี้
[นักเรียน setValue:@"Cosmic Class 1" Forkeypath:@"hmtclass.name"];
student.hmtclass.name = [นักเรียน ValueForkeyPath:@"hmtclass.name"];
3. ห่อหุ้มประเภทข้อมูลพื้นฐานโดยอัตโนมัติ
คัดลอกรหัสรหัสดังนี้:
#import <foundation/foundation.h>
@class hmtclass;
@Interface hmtstudent: nsobject
-
NSSTRING *_NAME;
หมายเลข nsinteger;
-
@จบ
[นักเรียน setValue:@"100" forkeypath:@"number"];
nsstring *number = [นักเรียน valueForkey:@"number"];
จะเห็นได้ว่าค่าแอตทริบิวต์ที่ตั้งค่าด้วย nsstring* type @"100" และแอตทริบิวต์ของเราเป็นประเภท nsinteger ดังนั้นจึงไม่มีปัญหากับการเข้าถึง
4. เพิ่มอาร์เรย์ nsarray ให้กับชั้นเรียนนักเรียนเพื่อเป็นตัวแทนของนักเรียนคนอื่น ๆ
คัดลอกรหัสรหัสดังนี้:
#import <foundation/foundation.h>
@class hmtclass;
@Interface hmtstudent: nsobject
-
NSARRAY *ManyStudents;
-
@จบ
นักเรียน *นักเรียน 1 = [[hmtstudent alloc] init];
นักเรียน *student2 = [[hmtstudent alloc] init];
นักเรียน *นักเรียน 3 = [[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];
[นักเรียน setValue: Array forkey:@"Manystudents"];
nslog (@"%@", [นักเรียน ValueForKeyPath:@"ManyStudents.Number"]);
พิมพ์ออกมาเป็นอาร์เรย์ (200,300,400)