目标:
我想使用观察者模式,以便当一个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?");
}
永远不会打电话给。
答案 0 :(得分:1)
我相信当两个子视图具有相同的标记时,-viewWithTag:
只会返回它找到的第一个子视图。因此,如果碰巧有两个tag = 1的视图,那么很可能你正在观察错误的视图。尝试更改object
调用-addObserver...
中的nil
参数,这表示您要观察所有对象的通知。