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?");
}
永远不会被调用。
我相信,当两个子视图具有相同的标签,-viewWithTag:
刚刚返回它找到的第一个。所以如果碰巧有tag = 1的两个视图,你很可能会观察到错误的视图。尝试-addObserver...
呼叫改变object
参数你nil
,这将表明要观察所有对象的通知。
我只是把它当做一个测试 - 它会是一个简单的方法来确定你是否观察错误的对象。 – Caleb 2012-07-17 18:35:08
所以你说的那个对象PARAM表明我要遵守通知时设定为零的所有对象,但我认为的addObserver参数是什么决定谁将会观察,在这种情况下它被设置为self。 – JohnMerlino 2012-07-17 18:42:39
做观察的对象是'self'。 “自我”观察的对象是[自我。查看viewWithTag:1]'。我上面说的是''[self.view viewWithTag:1]'可能不是您认为它的视图 - 如果视图层次结构中的某个其他视图也具有tag = 1,那么您可能正在观察该视图而不是你想到的那个。在任何*对象发布名为“ImageSwap”的通知时,在'-addObserver:...'调用中将'nil'替换为'[self.view viewWithTag:1]'将调用'updateButton:'方法。 – Caleb 2012-07-17 18:48:14
为什么你不只是调用图像变化的功能,当您更改背景图片?我不确定你需要通知中心。 – Dustin 2012-07-17 18:21:25
您是否正在更新跨类的图像视图?如果没有,那么我不会使用观察者模式。观察者模式用于发送全局更新,如果这些更改全部在同一个类中进行,则不应使用该模式。 如果处理不当,可能会遇到很多观察者遇到的问题。如尝试添加现有的或删除不存在的。 我建议,如果这是这一切被在同一类处理,只是用逻辑来确定何时更新相应图像视图。 – random 2012-07-17 18:24:56
那么上面的代码会如何导致问题呢? – JohnMerlino 2012-07-17 18:33:52