Un breve análisis de los ejemplos de KVO
He encontrado un problema recientemente. . Algunos anuncios son muy convenientes para pegar su propio logotipo en las coordenadas de la cabeza, pero al final, porque la longitud de los comentarios en cada página es diferente, las coordenadas también son diferentes, por lo que no puede dar las coordenadas muertas para pegar el logotipo. , Este problema se resuelve bien a través de KVO.
@KVO Descripción general:
KVO, es decir, la observación del valor clave, proporciona un mecanismo que cuando se modifican los atributos del objeto especificado, se notificará al objeto.
En pocas palabras, cada vez que se modifican los atributos del objeto observado especificado, KVO notificará automáticamente al observador correspondiente.
Los pasos para usar son los siguientes:
1. Regístrese, especifique los atributos del observador,
2. Implementar el método de devolución de llamada
3. Método de devolución de llamada de activación
4. Eliminar la observación
Ejemplo del código: Copie el código de la siguiente manera:
-(nulo) ViewDidload {
// kvo, como observador, siempre que la propiedad cambie "contente", el método de devolución de llamada notificará
[_WebView.ScrollView AddObServer: Self ForkyEpath:@Opciones "Contentsize": NSKeyValueObServingOptionNnew contexto: NULL];
}
// Método de devolución de llamada
- (nulo) ObserveValueForKeyPath: (NSString *) Keypath OfObject: (id) Cambio de objeto: (NSDICCIONARY *) Cambiar contexto: (voidvoid *) contexto
{{
if (object == _webview.scrollview && [keyypath isequalToString:@"contentsize"])
{{
// Obtener la coordenada y máxima
Cgsize size = _webview.scrollview.contentsize;
if (size.Height> 568.0) {
// Bloquear anuncios
_hidebottomIMage = [[uiImageView alloc] initwithframe: cgrectmake (0, size.height-67, screenwidth, 67)];
_hidebottomimage.image = [UIImage ImageNamed:@"Banner"];
[_webview.scrollView addSubView: _hidebottomIMage];
[_hidebottomimag liberación];
}
}
demás
{{
// llamar al método de clase principal
[Super ObserverValueForKeyPath: Keypath ofObject: Cambio de objeto: Cambiar contexto: contexto];
}
}
-(void) DealLoc {// ---> También puede llamar al método DealLoc en el entorno ARC, pero no necesita escribir [Super DealLoc]
// Eliminar KVO, de lo contrario, causará fugas de recursos
[_WebView.ScrollView RemoBoBServer: Self ForkyEpath:@"Contentsize"];
[Super DealLoc];
}
Lo anterior es para la propiedad Contentsize, y otras propiedades son similares.
KVC
Por lo general, todos asignamos y obtenemos valores a través del conjunto y obtenemos métodos de atributos. .
1. Método básico (setValue: forkey: valueforkey)
Copiar código del código de la siguiente manera:
// --- Defina una clase de estudiante (no hay operación en el archivo .m)
#import <Foundation/Foundation.h>
@Class HmtClass;
@Interface HmtStudent: NSObject {
Nsstring * _name;
Bool _test;
Bool _istest;
Prueba de bool;
Bool istest;
}
@Property (no atómico, copia) nsstring * nombre;
@Property (no atómico, copia) nsstring * sexo;
@Property (no atómica, asignación) edad nsinteger;
@Property (no atómico, fuerte) hmtclass * hmtclass;
@fin
// --- Archivo principal
Hmtstudent * student = [[hmtstudent alloc] init];
student.hmtclass = [[hmtclass alloc] init];
student.name = @"Humingtao";
// asignación de KVC
[Estudiante SetValue:@"Mawei Is Dog" Forkey:@"Nombre"];
[Estudiante SetValue:@"M" Forkey:@"Sex"];
[Estudiante SetValue:@(10) Forkey:@"Age"];
// Obtener el valor
Nslog (@"%s __%d__ |%@", __ función __, __ línea __, [estudiante valueForKey:@"nombre"]);
Atención especial:
También definí 4 variables de valor de bool en la clase para verificar el orden de las teclas de atributo de acceso KVC
[Estudiante SetValue:@(sí) Forkey:@"Test"];
El resultado es: _test -> _ istest-> test–> istest
2. Acceso a la ruta clave (utilizado para atribuir setValue: forkeypath: forkeypath)
Copiar código del código de la siguiente manera:
// crear una clase de clase
@Interface HMTClass: NSObject
@Property (no atómico, copia) nsstring * nombre;
@fin
Luego, en el primer punto anterior, un atributo de clase HMTClass está escrito en la clase de estudiante.
Copiar código del código de la siguiente manera:
Hmtclass *hmtclass = [[hmtclass alloc] init];
[HMTClass setValue:@"Cosmic Clase 1" Forkey:@"Nombre"];
[Estudiante SetValue: HMTClass Forkey:@"HMTClass"];
Nsstring *hmtclassname = [Student ValueForKeyPath:@"hmtclass.name"];
// Puede guardar el valor de este
[Estudiante SetValue:@"Cosmic Class 1" Forkyepath:@"hmtclass.name"];
student.hmtclass.name = [Student ValueForKeyPath:@"hmtclass.name"];
3. Encapsulan automáticamente los tipos de datos básicos.
Copiar código del código de la siguiente manera:
#import <Foundation/Foundation.h>
@Class HmtClass;
@Interface HmtStudent: NSObject
{{
Nsstring *_name;
Número de Nsinteger;
}
@fin
[Estudiante SetValue:@"100" Forkyepath:@"Número"];
Nsstring *number = [Student ValueForKey:@"Número"];
Se puede ver que el valor de atributo establecido con NSString* tipo @"100", y nuestro atributo es de tipo nsinteger, por lo que no hay problema con el acceso.
4. Agregue una matriz nsArray a la clase de estudiantes para representar a otros estudiantes.
Copiar código del código de la siguiente manera:
#import <Foundation/Foundation.h>
@Class HmtClass;
@Interface HmtStudent: NSObject
{{
Nsarray *muchos estudiantes;
}
@fin
Student *Student1 = [[HMTStudent Alloc] init];
Estudiante *student2 = [[hmtstudent alloc] init];
Student *Student3 = [[HMTStudent Alloc] init];
[Student1 setValue:@"200" forkey:@"número"];
[Student2 setValue:@"300" forkey:@"número"];
[Student3 setValue:@"400" forkey:@"número"];
NsArray *array = [nsArray ArrayWithObjects: Student1, Student2, Student3, nil];
[Estudiante SetValue: Array Forkey:@"Manystudents"];
Nslog (@"%@", [Student ValueForKeyPath:@"ManyStudents.number"]);
Impreso es una matriz (200,300,400)