KVOの例の簡単な分析
私は最近、プロジェクトでコメントインターフェイスを扱うときに問題に遭遇しました。私はUIWebViewを使用してコメントリストを表示したため、受け取ったページにCGSIZE(320、65)と厄介な広告がありました。いくつかの広告は、ヘッド座標に独自のロゴを貼り付けるのに非常に便利ですが、各ページのコメントの長さが異なるため、座標も異なるため、ロゴを貼り付けることはできません。 、この問題はKVOを通じてうまく解決されます。
@KVOの概要:
KVO、つまり、キー価値観察は、指定されたオブジェクトの属性が変更されると、オブジェクトが通知されるというメカニズムを提供します。
簡単に言えば、指定された観測されたオブジェクトの属性が変更されるたびに、KVOは対応するオブザーバーに自動的に通知します。
使用の手順は次のとおりです。
1.登録、オブザーバーの属性を指定します。
2。コールバックメソッドを実装します
3.トリガーコールバックメソッド
4。観測を削除します
コード例:次のようにコードをコピーします。
- (void)viewdidload {
// kvo、オブザーバーとして、プロパティが「コンテンツ化」が変更される限り、コールバックメソッドに通知されます
[_webview.scrollview addobserver:self forkeypath:@"contentsize" options:nskeyvalueobservingoptionnewコンテキスト:null];
}
//コールバックメソッド
- (void)observevalueforkeypath :( nsstring *)keypath ofobject :( id)object change :( nsdictionary *)Change Context :( voidvoid *)Context
{{
if(object == _webview.scrollview && [keypath isequaltString:@"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:keypath ofobject:オブジェクトの変更:Change Context:Context];
}
}
- (void)dealloc {// ---> ARC環境でDeallocメソッドを呼び出すこともできますが、[Super Dealloc]を書く必要はありません
// KVOを削除すると、リソースの漏れが発生します
[_webview.scrollview removerobserver:self forkeypath:@"Contentsize"];
[super dealloc];
}
上記はContentsizeプロパティ用で、他のプロパティは似ています。
KVC
通常、私たちはすべてセットを介して値を割り当て、属性のメソッドを取得します。 。
1。基本方法(setValue:forkey:valueforkey)
次のようにコードコードをコピーします。
// ---学生クラスを定義します(.mファイルに操作はありません)
#import <Foundation/Foundation.H>
@class hmtclass;
@interface hmtstudent:nsobject {
nsstring * _name;
bool _test;
bool _istest;
ブールテスト;
ブールイステスト;
}
@property(nonacomic、copy)nsstring * name;
@property(非原子、コピー)nsstring * sex;
@property(非原子、割り当て)nsinteger Age;
@property(非原子、強い)hmtclass * hmtclass;
@終わり
// ---メインファイル
hmtStudent * sustent = [[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 __、__ line __、[student valueforkey:@"name"]);
特別な注意:
また、KVCアクセス属性キーの順序を確認するために、クラス内の4つのブール値変数を定義しました
[学生setValue:@(yes)forkey:@"test"];
結果は次のとおりです。_test - > _ istest - > test - > iStest
2。キーパスアクセス(属性setValue:forkeypath:forkeypath)に使用)
次のようにコードコードをコピーします。
//クラスクラスを作成します
@interface hmtclass:nsobject
@property(nonacomic、copy)nsstring * name;
@終わり
次に、上記の最初のポイントでは、クラス属性hmtclassが学生クラスに書かれています。
次のようにコードコードをコピーします。
hmtclass *hmtclass = [[hmtclass alloc] init];
[hmtclass setValue:@"cosmic class 1" forkey:@"name"];
[Student SetValue:hmtclass forkey:@"hmtclass"];
nsString *hmtclassname = [sudint valueforkeypath:@"hmtclass.name"];
//このような値を保存できます
[Student SetValue:@"Cosmic class 1" forkeypath:@"hmtclass.name"];
Student.hmtclass.name = [Student ValueForKeypath:@"hmtclass.name"];
3.基本的なデータ型を自動的にカプセル化します。
次のようにコードコードをコピーします。
#import <Foundation/Foundation.H>
@class hmtclass;
@interface hmtstudent:nsobject
{{
nsstring *_name;
nsinteger番号;
}
@終わり
[学生setValue:@"100" forkeypath:@"number"];
nsString *number = [sustent valueforkey:@"number"];
nsString* type @"100"で設定された属性値があり、私たちの属性はnsintegerタイプであることがわかります。そのため、アクセスに問題はありません。
4.学生クラスにアレイnsarrayを追加して、他の学生を代表します。
次のようにコードコードをコピーします。
#import <Foundation/Foundation.H>
@class hmtclass;
@interface hmtstudent:nsobject
{{
nsarray *多くの人。
}
@終わり
学生 *Student1 = [[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:sustent1、student2、sudent3、nil];
[学生setValue:array forkey:@"ManyStudents"];
nslog(@"%@"、[学生価値ForKeypath:@"ManyStudents.Number"]);
印刷されたアレイ(200,300,400)