2012-07-17 108 views
0

目标:iphone - 不通知被解雇

我想用Observer模式,这样,当一个接收的UIImageView不同的背景图像,然后2周的UIImageViews将侦听的变化,然后改变自己。

策略:

根据我了解的Objective-C的观察者模式,我决定实施nsnotificationcenter。

代码:

自我指RemoteViewManagerController,updateButtons是当ImageSwap事件被触发,将被调用的方法和对象指的是“主”的UIImageView,也就是改变了当的UIImageView会导致其他uiimageviews的变化。

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

setDefaultButtons被调用时,我们通过基于标签的按钮和目标按钮迭代。 “main”uiviewimage的标签为1.因此,我们调用setImageChange来更改该按钮的背景图像,结果,我想触发ImageSwap事件,更改其他两个uiimageview按钮,然后通过这些按钮按钮是userinfo字典的一部分。这个想法是当updateButton被调用时,我可以引用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?"); 
} 

永远不会被调用。

+0

为什么你不只是调用图像变化的功能,当您更改背景图片?我不确定你需要通知中心。 – Dustin 2012-07-17 18:21:25

+0

您是否正在更新跨类的图像视图?如果没有,那么我不会使用观察者模式。观察者模式用于发送全局更新,如果这些更改全部在同一个类中进行,则不应使用该模式。 如果处理不当,可能会遇到很多观察者遇到的问题。如尝试添加现有的或删除不存在的。 我建议,如果这是这一切被在同一类处理,只是用逻辑来确定何时更新相应图像视图。 – random 2012-07-17 18:24:56

+0

那么上面的代码会如何导致问题呢? – JohnMerlino 2012-07-17 18:33:52

回答

1

我相信,当两个子视图具有相同的标签,-viewWithTag:刚刚返回它找到的第一个。所以如果碰巧有tag = 1的两个视图,你很可能会观察到错误的视图。尝试-addObserver...呼叫改变object参数你nil,这将表明要观察所有对象的通知。

+0

我只是把它当做一个测试 - 它会是一个简单的方法来确定你是否观察错误的对象。 – Caleb 2012-07-17 18:35:08

+0

所以你说的那个对象PARAM表明我要遵守通知时设定为零的所有对象,但我认为的addObserver参数是什么决定谁将会观察,在这种情况下它被设置为self。 – JohnMerlino 2012-07-17 18:42:39

+0

做观察的对象是'self'。 “自我”观察的对象是[自我。查看viewWithTag:1]'。我上面说的是''[self.view viewWithTag:1]'可能不是您认为它的视图 - 如果视图层次结构中的某个其他视图也具有tag = 1,那么您可能正在观察该视图而不是你想到的那个。在任何*对象发布名为“ImageSwap”的通知时,在'-addObserver:...'调用中将'nil'替换为'[self.view viewWithTag:1]'将调用'updateButton:'方法。 – Caleb 2012-07-17 18:48:14