好的,所以这实际上已经解决了 - 但我不明白为什么我做了什么。
我的问题是发送一次通知会导致一个事件多次触发。我最终在堆栈上看到了几个不需要的视图。在坚果壳中:
用户按下工具栏中的按钮,会从代理发送通知
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 ] ;
}
这会在当前视图中触发一个函数,将地图视图推送到堆栈上。
-(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];
}
现在,我改变了最后一行:
CultureNOWAppDelegate *delegate =
[[UIApplication sharedApplication] delegate];
[delegate.navigationController pushViewController:mapViewController
animated:YES];
为:
[self.navigationController pushViewController:mapViewController animated:YES];
结果是,尽管 openListMap 函数仍然会多次触发(您可以在控制台中看到,自应用程序启动以来每次出现视图时,日志输出都显示“Map Created” )它只将最新的mapView推入堆栈。
但为什么呢?为什么它首先会多次触发,为什么它会通过交换两段代码而停止,这些代码实际上和目的相同?
感谢您的任何想法。
答案 0 :(得分:5)
它发射2次这一事实警告我,你的“修复”并不是一个真正的解决方案 - 这是Apple的API的一种行为恰好做你想要的。
我在应用程序中遇到了类似的问题,其中通知莫名其妙地被解雇了两次。我后来意识到通知只被调用一次 - 但是在NSNotificationCenter
内部,没有什么可以阻止你为完全相同的选择器回调注册完全相同的事件的两个观察者。
这发生在我们身上,因为我们在viewDidLoad
添加了观察者,但从未删除viewDidUnload
中的观察者。然后,当用户的手机内存不足时(感谢Apple,在iOS4 +中发生了很多),视图会被刷新,当第二次调用viewDidLoad时,最终会有2个观察者。
这可能不是您的确切问题 - 但我想知道您在哪里注册观察员通知。