Une brève analyse des exemples de KVO
J'ai rencontré un problème récemment. . Certaines publicités sont très pratiques pour coller leur propre logo sur les coordonnées de la tête, mais à la fin, car la durée des commentaires sur chaque page est différente, les coordonnées sont également différentes, vous ne pouvez donc pas donner les coordonnées mortes pour coller le logo. , Ce problème est bien résolu par KVO.
@KVO Présentation:
KVO, c'est-à-dire l'observation de la valeur clé, il fournit un mécanisme que lorsque les attributs de l'objet spécifié sont modifiés, l'objet sera informé.
Autrement dit, chaque fois que les attributs de l'objet observé spécifié sont modifiés, KVO informera automatiquement l'observateur correspondant.
Les étapes à utiliser sont les suivantes:
1. Enregistrez-vous, spécifiez les attributs de l'observateur,
2. Implémentez la méthode de rappel
3. Méthode de rappel de déclenchement
4. Retirer l'observation
Exemple de code: Copiez le code comme suit:
- (void) ViewDidload {
// KVO, en tant qu'observateur, tant que la propriété "Contentsize" change, la méthode de rappel informera
[_WebView.ScrollView addObserver: self pour keypath: @ "Contentsize" Options: nskeyvalueoBservingOptionNew Context: null];
}
// Méthode de rappel
- (void) ObservaleValueforKeyPath: (nsstring *) keypath ofobject: (id) Change d'objet: (nsdictionary *) Contexte de changement: (voidVoid *) contexte
{{
if (object == _webView.scrollView && [keypath isEqualToString: @ "Contentsize"])
{{
// Obtenez la coordonnée Y maximale
Cgsize size = _webView.scrollView.ConTtentsize;
if (size.height> 568.0) {
// Bloquer les annonces
_HideBottoMImage = [[uiImageView alloc] initWithFrame: cGrectMake (0, size.height-67, screenwidth, 67)];
_HideBottoMimage.image = [UIImage ImageNameD: @ "Banner"];
[_WebView.ScrollView AddSubView: _HideBottoMimage];
[_Hidebottomimag Release];
}
}
autre
{{
// appelle la méthode de la classe parent
[Super ObserveValueforKeyPath: Keypath OfObject: Changement d'objet: Changement Contexte: Context];
}
}
- (void) Dealloc {// ---> Vous pouvez également appeler la méthode de Dealloc dans l'environnement Arc, mais vous n'avez pas besoin d'écrire [Super Dealloc]
// supprimer KVO, sinon cela entraînera une fuite de ressources
[_WebView.ScrollView Supv-Oobserver: self forKeyPath: @ "Contentsize"];
[Super Dealloc];
}
Ce qui précède est pour la propriété de contente, et d'autres propriétés sont similaires.
KVC
Habituellement, nous attribuons tous et obtenons des valeurs via l'ensemble et obtenons des méthodes d'attributs. .
1. Méthode de base (setValue: ForKey: ValueforKey)
Copier le code du code comme suit:
// --- Définissez une classe étudiante (il n'y a pas de fonctionnement sur le fichier .m)
#import <Foundation / Foundation.h>
@class hmtclass;
@interface hmtstudent: nsObject {
Nsstring * _name;
Bool _test;
Bool _istest;
Test bool;
Bool istest;
}
@property (non atomique, copie) nsstring * name;
@property (non atomique, copie) nsstring * sexe;
@property (non atomique, attribution) nsinteger Âge;
@property (non atomique, fort) hmtclass * hmtclass;
@fin
// --- Fichier principal
HmtStudent * étudiant = [[hmtStudent alloc] init];
Student.hmtClass = [[HmtClass alloc] init];
Student.name = @ "Humingtao";
// Affectation KVC
[Student setValue: @ "Mawei is dog" forkey: @ "name"];
[Student setValue: @ "m" forkey: @ "sexe"];
[Student setValue: @ (10) ForKey: @ "Age"];
// Obtenez la valeur
Nslog (@ "% s __% d__ |% @", __ fonction __, __ ligne __, [Student Valueforkey: @ "name"]);
Attention particulière:
J'ai également défini 4 variables de valeur bool dans la classe pour vérifier l'ordre des touches d'attribut d'accès KVC
[Student setValue: @ (Oui) ForKey: @ "test"];
Le résultat est: _test -> _ ISTOST RET `` Test ``> ISTOST
2. Accès au chemin de clé (utilisé pour attribuer SetValue: ForKeyPath: ForKeyPath)
Copier le code du code comme suit:
// Créer une classe de classe
@Interface HmtClass: nsObject
@property (non atomique, copie) nsstring * name;
@fin
Ensuite, dans le premier point ci-dessus, un attribut de classe HMTClass est écrit dans la classe étudiante.
Copier le code du code comme suit:
Hmtclass * hmtclass = [[hmtclass alloc] init];
[hmtclass setValue: @ "Cosmic Class 1" forkey: @ "name"];
[Student setValue: hmtclass forkey: @ "hmtclass"];
NsString * hmtClassName = [Student ValueforKeyPath: @ "hmtclass.name"];
// Vous pouvez enregistrer la valeur comme celle-ci
[Student setValue: @ "Cosmic Class 1" ForKeyPath: @ "hmtclass.name"];
Student.hmtclass.name = [Student ValueforKeyPath: @ "hmtclass.name"];
3. Résumer automatiquement les types de données de base.
Copier le code du code comme suit:
#import <Foundation / Foundation.h>
@class hmtclass;
@Interface HMTStudent: NSObject
{{
Nsstring * _name;
Numéro nsinteger;
}
@fin
[Student setValue: @ "100" forKeyPath: @ "numéro"];
NsString * numéro = [Student ValueforKey: @ "nombre"];
On peut voir que la valeur d'attribut définie avec nsstring * type @ "100", et notre attribut est de type nSinteger, il n'y a donc aucun problème avec l'accès.
4. Ajoutez un tableau NSARRAY à la classe étudiante pour représenter d'autres étudiants.
Copier le code du code comme suit:
#import <Foundation / Foundation.h>
@class hmtclass;
@Interface HMTStudent: NSObject
{{
NSARRAY * ManyStudents;
}
@fin
Student * Student1 = [[hmtStudent alloc] init];
Student * Student2 = [[HmTstudent alloc] init];
Étudiant * Student3 = [[HmtStudent alloc] init];
[Student1 setValue: @ "200" forkey: @ "numéro"];
[Student2 setValue: @ "300" forkey: @ "numéro"];
[Student3 setValue: @ "400" forkey: @ "numéro"];
NsArray * array = [nsarray arraywithObjects: Student1, Student2, Student3, nil];
[Student setValue: Array ForKey: @ "ManyStudents"];
Nslog (@ "% @", [Student ValueforKeyPath: @ "ManyStudents.number"]);
Imprimé est un tableau (200 300 400)