iPhone SDK - 通知多次触发,并将多个视图推送到堆栈

dgi*_*gig 1 iphone sdk notifications uinavigationcontroller

好的,所以这实际上已经解决了 - 但我不明白为什么我的工作.

我的问题是发送一次通知会导致一次事件多次触发.我最终在堆栈上看到了几个不需要的视图.简而言之:

用户按下工具栏中的按钮,从代理发送通知

mapItem = [[UIBarButtonItem alloc] initWithImage:mapImage style: UIBarButtonItemStylePlain target:self action:@selector(mapButtonPressed:)];

-(void)mapButtonPressed:(id)sender{
    NSLog(@"Map Button Pressed");
    [[NSNotificationCenter defaultCenter] postNotificationName:@"mapButtonPressed" object:nil ] ;
}
Run Code Online (Sandbox Code Playgroud)

这会在当前视图中触发一个函数,将地图视图推送到堆栈上.

-(void)openListMap:(NSNotification *)aNotification {

    mapViewController = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil];

    NSLog(@"Map Created");

    mapViewController.searchLocation = searchLocation;
    if(givenLocationType == @"input"){
        mapViewController.inputLocationText = inputLocationText;
    }
    mapViewController.givenLocationType = givenLocationType;

    CultureNOWAppDelegate *delegate =
    [[UIApplication sharedApplication] delegate];
    [delegate.navigationController pushViewController:mapViewController
                                      animated:YES];

}
Run Code Online (Sandbox Code Playgroud)

现在,我改变了最后一行:

CultureNOWAppDelegate *delegate =
    [[UIApplication sharedApplication] delegate];
    [delegate.navigationController pushViewController:mapViewController
                                      animated:YES];
Run Code Online (Sandbox Code Playgroud)

至:

[self.navigationController pushViewController:mapViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

结果是,尽管openListMap函数仍然会多次触发(您可以在控制台中看到,自应用程序启动以来每次出现视图时,日志输出显示"Map Created")它只将最新的mapView推送到堆栈.

但为什么?为什么它首先会多次触发,为什么它会通过交换两段代码而停止,这些代码对于所有意图和目的都是相同的?

谢谢你的任何想法.

mak*_*dad 5

事实上它被点燃2次警告我,你的"修复"并不是真正的解决方案 - 这是Apple的API的一种行为恰好做你想要的.

我在应用程序中遇到了类似的问题,其中通知莫名其妙地被解雇了两次.我后来意识到通知只被调用一次 - 但是在内部NSNotificationCenter,没有什么可以阻止你为完全相同的选择器回调注册完全相同的事件的两个观察者.

这发生在我们身上,因为我们添加了观察员viewDidLoad,但从未删除观察员viewDidUnload.然后,当用户的手机内存不足时(感谢Apple,在iOS4 +中发生了很多),视图会被刷新,当第二次调用viewDidLoad时,最终会有2个观察者.

这可能不是您的确切问题 - 但我想知道您在哪里注册观察员通知.