Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iphone-未触发通知_Iphone_Objective C_Nsnotificationcenter - Fatal编程技术网

iphone-未触发通知

iphone-未触发通知,iphone,objective-c,nsnotificationcenter,Iphone,Objective C,Nsnotificationcenter,目标: 我想使用观察者模式,这样当一个uiimageview接收到不同的背景图像时,另外两个uiimageview将侦听该更改,然后更改它们自己 战略: 根据我在objective-c中读到的关于观察者模式的内容,我决定实现nsnotificationcenter 代码: self指的是RemoteViewManagerController,updateButtons指的是在激发ImageSwap事件时将调用的方法,object指的是“main”uiimageview,即uiimageview,

目标:

我想使用观察者模式,这样当一个uiimageview接收到不同的背景图像时,另外两个uiimageview将侦听该更改,然后更改它们自己

战略:

根据我在objective-c中读到的关于观察者模式的内容,我决定实现nsnotificationcenter

代码:

self指的是RemoteViewManagerController,updateButtons指的是在激发ImageSwap事件时将调用的方法,object指的是“main”uiimageview,即uiimageview,更改后将导致其他uiimageview中的更改

- (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字典的一部分。其思想是,当调用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?");
}

从未调用。

我认为当两个子视图具有相同的标记时,
-viewWithTag:
只返回它找到的第一个。因此,如果碰巧有两个tag=1的视图,很可能您观察到的是错误的视图。尝试更改
-addObserver…
调用中的
对象
参数
-addObserver…
调用
nil
,这将表明您希望观察所有对象的通知。

更改背景图像时,为什么不调用图像更改功能?我不确定您是否需要通知中心。您是否正在跨类更新图像视图?如果不是,那么我就不会使用观察者模式。观察者模式用于发送全局更新,如果这些更改都是在同一个类中进行的,则不应使用。如果观察者处理不当,你可能会遇到很多问题。例如,尝试添加现有的或删除不存在的。我建议,如果这一切都是在同一个类中处理的,只需使用逻辑来确定何时更新相应的图像视图。那么上面的代码会如何导致问题?@cory你能解释一下上面的代码会如何导致问题吗?下面由Caleb回答。我只是想作为一个测试来做——这是一个很容易理解的方法是否正在观察错误的对象。因此,您说object参数表示我希望在设置为nil时观察所有对象的通知,但我认为addObserver参数决定谁将要观察,在本例中,它被设置为self。进行观察的对象是
self
self
正在观察的对象是
[self.view view-withtag:1]
。我上面说的是,
[self.view viewWithTag:1]
可能不是您认为的视图--如果视图层次结构中的其他视图也有tag=1,您可能正在观察该视图,而不是您心目中的视图。在
-addObserver:…
调用中用
nil
替换
[self.view view withtag:1]
将导致在任何对象发布名为“ImageSwap”的通知时调用
更新按钮:
方法。