目标:
我想使用观察者模式,这样当一个 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?");
}
永远不会被调用。