iphone - 没有被解雇的通知

时间:2012-07-17 18:16:37

标签: iphone objective-c nsnotificationcenter

目标:

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

策略:

基于我在objective-c中读到的观察者模式,我决定实现nsnotificationcenter。

代码:

self指向RemoteViewManagerController,updateButtons是在触发ImageSwap事件时将被调用的方法,而object指的是“主”uiimageview,即uiimageview在更改时将导致其他uiimageviews中的更改。 / p>

- (void)registerButtonObserver:(UIView *)currentView
{  
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateButtons:) name:@"ImageSwap" object:[self.view viewWithTag:1]];
}

调用setDefaultButtons,我们根据标签迭代按钮和目标按钮。 “主”uiviewimage的标签为1.所以我们调用setImageChange来改变该按钮的背景图像,结果,我想触发ImageSwap事件,改变其他两个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行,因为这行确实触发了:NSLog(@“但我们肯定能到达这里”);

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

- (void)updateButtons:(NSNotification*)notification 
{
    NSLog(@"Do we get here?");
}
永远不会打电话给

1 个答案:

答案 0 :(得分:1)

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