我想用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?");
}
永远不会被调用。
为什么你不只是调用图像变化的功能,当您更改背景图片?我不确定你需要通知中心。 – Dustin 2012-07-17 18:21:25
您是否正在更新跨类的图像视图?如果没有,那么我不会使用观察者模式。观察者模式用于发送全局更新,如果这些更改全部在同一个类中进行,则不应使用该模式。 如果处理不当,可能会遇到很多观察者遇到的问题。如尝试添加现有的或删除不存在的。 我建议,如果这是这一切被在同一类处理,只是用逻辑来确定何时更新相应图像视图。 – random 2012-07-17 18:24:56
那么上面的代码会如何导致问题呢? – JohnMerlino 2012-07-17 18:33:52