0

目标:

我想使用观察者模式,这样当一个 uiimageview 接收到不同的背景图像时,其他 2 个 uiimageview 将监听该更改,然后更改自己。

战略:

根据我在 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 事件,以更改其他两个 uiimageview 按钮,然后我传入那些按钮用户信息字典的一部分。这个想法是当调用 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 行,因为这行确实触发了: NSLog(@"But we sure to get here right");

我没有收到任何错误。但是 RemoteViewManagerController.m 中的这一行:

- (void)updateButtons:(NSNotification*)notification 
{
    NSLog(@"Do we get here?");
}

永远不会被调用。

4

1 回答 1

1

我相信当两个子视图具有相同的标签时,-viewWithTag:只返回它找到的第一个。因此,如果碰巧有两个视图的 tag=1,那么您很可能观察到了错误的视图。尝试将调用中的object参数更改为,这将表明您要观察所有对象的通知。-addObserver...nil

于 2012-07-17T18:22:17.070 回答