Eine kurze Analyse von KVO -Beispielen
Ich habe kürzlich ein Problem gestoßen. . Einige Anzeigen sind sehr bequem, um ihr eigenes Logo auf die Kopfkoordinaten einzufügen, aber am Ende ist die Länge der Kommentare auf jeder Seite unterschiedlich, so sind die Koordinaten auch unterschiedlich, sodass Sie die toten Koordinaten nicht zum Einfügen des Logos geben können. Dieses Problem wird durch KVO gut gelöst.
@KVO -Übersicht:
KVO, dh ein Schlüsselwertbeobachtung, liefert es einen Mechanismus, dass das Objekt benachrichtigt wird, wenn die Attribute des angegebenen Objekts geändert werden.
Einfach ausgedrückt wird KVO jedes Mal, wenn die Attribute des angegebenen beobachteten Objekts geändert werden, den entsprechenden Beobachter automatisch benachrichtigt.
Die Gebrauchsschritte sind wie folgt:
1. Registrieren Sie die Attribute des Beobachters,
2. Implementieren Sie die Rückrufmethode
A.
4. Beobachtung entfernen
CODE -Beispiel: Kopieren Sie den Code wie folgt:
-(void) viewDidload {
// KVO als Beobachter, solange die Eigenschaft ändert, wird die Rückrufmethode benachrichtigt
[_webView.ScrollView Addobserver: Self Forkeypath:@"ContentSize" Optionen: nskeyValueObSVingoptionNew -Kontext: null];
}
// Rückrufmethode
- (void) observalueforkeypath: (nsstring *) Tastaturen OFObject: (ID) Objektänderung: (NSDictionary *) Änderung Kontext: (voidvoid *) Kontext
{{{{
if (object == _webview.scrollview && [tastePath isequalToString:@"contentSize"])
{{{{
// Erhalten Sie die maximale Y -Koordinate
CgSize size = _webView.scrollView.ContentSize;
if (size.height> 568.0) {
// Anzeigen blockieren
_hidebottomimage = [[UiImageView alloc] initWithFrame: cGrectMake (0, Größe.Height-67, Screenwidth, 67)];
_HidebottOmimage.image = [UIImage ImageNamed:@"Banner"];
[_webview.scrollView addSubView: _hidebottomimage];
[_hidebottomimag Release];
}
}
anders
{{{{
// rufen Sie die übergeordnete Klassenmethode auf
[Super ObservalueForKeypath: Tastatur OfObject: Objektänderung: Änderung Kontext: Kontext];
}
}
-(void) overloc {// ---> Sie können auch die OVALLOC-Methode in der ARC-Umgebung aufrufen, aber Sie müssen nicht schreiben [Super Dealloc]
// KVO entfernen, andernfalls verursacht es Ressourcenleckage
[_webview.scrollView removeObserver: self Forkeypath:@"contentSize"];
[Super Dealloc];
}
Das obige ist für die Inhaltseigenschaft und andere Eigenschaften sind ähnlich.
KVC
Normalerweise weisen wir alle Werte über die SET- und Attributmethoden ab und erhalten die Verwendung von Schlüsselwert-Codierung (KVC), um die Attribute einer Klasse zuzuweisen und Werte zuzuweisen und Werte abzurufen. .
1. Grundlegende Methode (SetValue: Forkey: ValueForKey)
Kopieren Sie den Code -Code wie folgt:
// --- Definieren Sie eine Schülerklasse (es gibt keine Operation in der .m-Datei)
#import <foundation/foundation.h>
@Class HMTClass;
@Interface HMtstudent: NSObject {
Nsstring * _name;
Bool _test;
Bool _istest;
Bool -Test;
Bool iStest;
}
@property (nichtatomic, kopieren) nsstring * Name;
@property (nichtatomic, kopieren) nsstring * sex;
@Property (nichtatomic, zugewiesen) NStinterger Age;
@Property (nichtatomic, stark) HMTClass * HMTClass;
@Ende
// --- Hauptdatei
Hmtstudent * student = [[hmtstudent alloc] init];
Student.HmtClass = [[HMTCASS alloc] init];
student.name = @"Humingtao";
// KVC -Zuordnung
[Student SetValue:@"mawei ist Hund" Forkey:@"Name"];
[Student SetValue:@"M" Forkey:@"Sex"];
[Student SetValue:@(10) Forkey:@"Age"];
// den Wert erhalten
NSLog (@"%s __%d__ |%@", __ Funktion __, __ Zeile __, [Schüler valueForkey:@"Name"]);
Besondere Aufmerksamkeit:
Ich habe auch 4 BOOL -Wertvariablen in der Klasse definiert, um die Reihenfolge der KVC -Zugriffsattributschlüssel zu überprüfen
[Student SetValue:@(ja) Forkey:@"Test"];
Das Ergebnis ist: _test -> _ ISTEST -> Test -> istest
2. Zugriff auf Key Pfad (verwendet zum Attribut von SetValue: Forkeypath: Forkeypath)
Kopieren Sie den Code -Code wie folgt:
// Erstellen Sie eine Klassenklasse
@Interface HMTClass: NSObject
@property (nichtatomic, kopieren) nsstring * Name;
@Ende
Im ersten Punkt oben ist ein Klassenattribut HMTClass in der Schülerklasse geschrieben.
Kopieren Sie den Code -Code wie folgt:
HMTCLASS *HMTCLASS = [[HMTCLASS alloc] init];
[HMTCLASS SETVALUE:@"Cosmic Class 1" Forkey:@"Name"];
[Student SetValue: HMTCLASS Forkey:@"HMTClass"];
Nsstring *hmtClassName = [Student ValueForKeypath:@"hmtClass.name"];
// Sie können den Wert wie diesen speichern
[Student SetValue:@"Cosmic Class 1" ForkeyPath:@"hmtClass.name"];
student.hmtclass.name = [student ValueForKeypath:@"hmtClass.name"];
A.
Kopieren Sie den Code -Code wie folgt:
#import <foundation/foundation.h>
@Class HMTClass;
@Interface HMtstudent: NSObject
{{{{
Nsstring *_name;
NStineger -Nummer;
}
@Ende
[Student SetValue:@"100" Forkeypath:@"Nummer"];
Nsstring *number = [student valueForkey:@"number"];
Es ist ersichtlich, dass der Attributwert mit NSString* -Typ @"100" und unser Attribut von NStinger -Typ ist, sodass es kein Problem mit dem Zugriff gibt.
4. Fügen Sie der Schülerklasse einen Array -Nsarray hinzu, um andere Schüler zu vertreten.
Kopieren Sie den Code -Code wie folgt:
#import <foundation/foundation.h>
@Class HMTClass;
@Interface HMtstudent: NSObject
{{{{
Nsarray *Viele Students;
}
@Ende
Student *student1 = [[HMtstudent alloc] init];
Student *student2 = [[HMtstudent alloc] init];
Student *student3 = [[HMtstudent alloc] init];
[student1 setValue:@"200" Forkey:@"Nummer"];
[student2 setValue:@"300" Forkey:@"Nummer"];
[student3 setValue:@"400" Forkey:@"Nummer"];
NsArray *array = [nsarray arrayWithObjects: student1, student2, student3, nil];
[Student SetValue: Array Forkey:@"Manystudents"];
NSLog (@"%@", [Student ValueForKeypath:@"Manystudents.number"]);
Gedruckt ist ein Array (200.300.400)