ゴール:
Observer パターンを使用して、1 つの uiimageview が異なる背景画像を受け取ったときに、他の 2 つの uiimageviews がその変更をリッスンしてから変更するようにします。
ストラテジー:
Objective-C のオブザーバー パターンについて読んだことに基づいて、nsnotificationcenter を実装することにしました。
コード:
self は RemoteViewManagerController を参照し、updateButtons は ImageSwap イベントが発生したときに呼び出されるメソッドであり、object は「メイン」の uiimageview、つまり、変更されると他の uiimageview に変更をもたらす uiimageview を参照します。
- (void)registerButtonObserver:(UIView *)currentView
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateButtons:) name:@"ImageSwap" object:[self.view viewWithTag:1]];
}
setDefaultButtons が呼び出され、タグに基づいてボタンとターゲット ボタンを反復処理します。「メイン」の uiviewimage には 1 のタグがあります。そのため、setImageChange を呼び出してそのボタンの背景画像を変更します。その結果、ImageSwap イベントを発生させて、他の 2 つの uiimageview ボタンを変更し、それらを渡します。ボタンは userinfo ディクショナリの一部です。アイデアは、updateButtons が呼び出されたときに、userinfo ディクショナリでこれらのボタンを参照できるということです。
- (void)setDefaultButtons:(UIView *)currentView
{
for( UIView *view in currentView.subviews ) {
if( [view isKindOfClass:[UIButton class]] ) {
if( view.tag == 1 ){
[self setImageChange:@"fence" forButton:view];
NSArray *keys = [NSArray arrayWithObjects:@"subview1", @"subview2", nil];
NSArray *objects = [NSArray arrayWithObjects:[self.view viewWithTag:4], [self.view viewWithTag:5], nil];
NSDictionary *items = [NSDictionary dictionaryWithObjects:objects
forKeys:keys];
NSLog(@"But we sure to get here right");
[[NSNotificationCenter defaultCenter]postNotificationName:@"ImageSwap" object:view userInfo:items];
}
else if(view.tag == 2){
[self setImageChange:@"siren" forButton:view];
}
else if(view.tag == 3){
[self setImageChange:@"auxiliary" forButton:view];
}
}
}
}
postNotificationName 行に到達することがわかっていることに注意してください。これは、この行が起動するためです。
エラーは発生しません。しかし、RemoteViewManagerController.m の次の行:
- (void)updateButtons:(NSNotification*)notification
{
NSLog(@"Do we get here?");
}
呼び出されることはありません。