0

ゴール:

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?");
}

呼び出されることはありません。

4

1 に答える 1

1

2 つのサブビューに同じタグが付いている場合-viewWithTag:は、最初に見つかったものを返すだけだと思います。したがって、tag=1 のビューが 2 つある場合は、間違ったビューを観察している可能性があります。への呼び出しのobjectパラメーターを変更してみてください。これは、すべてのオブジェクトに対してその通知を監視することを示します。-addObserver...nil

于 2012-07-17T18:22:17.070 に答える