Краткий анализ примеров KVO
В последнее время я столкнулся с проблемой. . , Эта проблема хорошо решается через KVO.
@Kvo Обзор:
KVO, то есть наблюдение за ключевыми значениями, он обеспечивает механизм, который, когда атрибуты указанного объекта изменяются, объект будет уведомлен.
Проще говоря, каждый раз, когда изменяются атрибуты указанного наблюдаемого объекта, KVO автоматически уведомляет соответствующего наблюдателя.
Шаги для использования следующие:
1. Зарегистрируйтесь, укажите атрибуты наблюдателя,
2. Реализация метода обратного вызова
3. Метод обратного вызова запуска
4. Удалить наблюдение
Пример кода: скопируйте код следующим образом:
-(void) viewDidload {
// kvo, как наблюдатель, если изменение свойства «содержит», метод обратного вызова будет уведомить
[_webview.scrollview addobserver: self forkeypath:@"contentsize" Параметры: nskeyvalueobservingoptionnew context: null];
}
// Метод обратного вызова
- (void) ObserveValueForKeyPath: (nsString *) Клавиатура OFOBJECT
{{
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:@"banner"];
[_WebView.scrollView addSubview: _hidebottomimage];
[_hidebottomimag релиз];
}
}
еще
{{
// Вызов метод родительского класса
[Super ObserveValueForKeypath: Клавиатура OfBject: Изменение объекта: изменение контекста: контекст];
}
}
-(void) dealloc {// ---> Вы также можете вызвать метод Dealloc в дуговой среде, но вам не нужно писать [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;
Bool _test;
Bool _istest;
Bool Test;
Лопатка;
}
@property (nonatomic, копия) nsstring * name;
@property (неатомная, копия) nsstring * sex;
@property (неатомный, назначен) nsinteger ровя;
@property (неатомный, сильный) hmtclass * hmtclass;
@конец
// --- Основной файл
Hmtstudent * student = [[hmtstudent alloc] init];
Student.hmtclass = [[hmtclass alloc] init];
Student.name = @"Humingtao";
// назначение KVC
[Студент setValue:@"mawei is Dog" forkey:@"name"];
[Студент setValue:@"m" forkey:@"sex"];
[Студент setValue:@(10) forkey:@"age"];
// Получить значение
Nslog (@"%s __%d__ |%@", __ function __, __ строка __, [студент valueforkey:@"name"]);
Особое внимание:
Я также определил 4 переменных значения Bool в классе, чтобы проверить порядок клавиш атрибута Access KVC
[Студент setValue:@(Да) forKey:@"test"];
Результат: _test ―> _ Istest
2. Доступ к ключевым пути (используется для атрибуции setValue: forkeypath: forkeypath)
Код кода копирования следующим образом:
// Создать класс класса
@Interface hmtclass: nsobject
@property (nonatomic, копия) nsstring * name;
@конец
Затем в первой точке выше, атрибут класса HMTClass написан в классе учеников.
Код кода копирования следующим образом:
Hmtclass *hmtclass = [[hmtclass alloc] init];
[hmtclass setValue:@"Космический класс 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:@"№"];
Nsstring *number = [valuest forkey:@"number"];
Можно видеть, что значение атрибута, установленное с NSString* Type @"100", и наш атрибут имеет тип NSInteger, поэтому с доступом нет проблем.
4. Добавьте массив NSArray в класс учеников, чтобы представлять других студентов.
Код кода копирования следующим образом:
#Import <Foundation/Foundation.h>
@class hmtclass;
@Interface hmtStudent: nsobject
{{
Nsarray *Mancestudents;
}
@конец
Студент *Студент1 = [[hmtstudent alloc] init];
Студент *Студент2 = [[hmtstudent alloc] init];
Студент *Студент3 = [[hmtstudent alloc] init];
[Student1 setValue:@"200" forkey:@"№"];
[Student2 setValue:@"300" forkey:@"№"];
[Student3 setValue:@"400" forkey:@"№"];
Nsarray *array = [nsarray arraywithobjects: студент1, студент2, студент3, ноль];
[Студент SetValue: Array Forkey:@"Mancestudents"];
Nslog (@"%@", [Student valueforkeypath:@"manystudents.number"]);
Отпечатано - это массив (200 300 400)