我有一个包含表视图的视图控制器,可以选择表中的项目和正确创建的详细视图控制器.
表中的项表示可以具有与其关联的基于时间的触发器的项目,并且为每个项目安排本地通知,如果当本地通知到期时应用程序在前台,则自动显示该项目的详细视图.
我有一个问题,当两个通知同时到期导致视图无法正常显示时,以及控制台日志:"NNN的开始/结束外观转换的不平衡调用",其中NNN是我的详细视图控制器.
表视图控制器创建如下:
self.tableViewController = [[TableViewController alloc] initWithNibName:@"TableView" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.tableViewController];
self.window.rootViewController = navController;
Run Code Online (Sandbox Code Playgroud)
当本地通知到期并且调用didReceiveLocalNotification:时,app会使用NSNotifcationCenter postNotificationName:来广播通知,并且表视图控制器正在侦听该通知.当表视图控制器收到该通知时,它会创建详细视图控制器并将其推送到堆栈,如下所示:
[self.navigationController pushViewController:detailViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)
我在某处读到如果一个视图控制器在它本身不在堆栈顶部时推送另一个视图控制器可能会出现问题 - 所以我认为这一定是问题,因为当表视图控制器收到第二个通知时它会不再位于导航堆栈的顶部,因为它在以前只是在第一个通知到达时将详细视图控制器推送到堆栈上.
所以我将推送代码更改为:
[[self.navigationController topViewController].navigationController pushViewController:detailController animated:YES];
Run Code Online (Sandbox Code Playgroud)
但它没有任何区别.
所以我接下来认为可能会出现问题,因为第一个细节视图控制器没有机会在推送第二个视图控制器之前完全显示 - 所以我改变了我的应用程序的通知发布使用:
[[NSNotificationCenter defaultCenter] postNotificationName:
Run Code Online (Sandbox Code Playgroud)
至
[[NSNotificationQueue defaultQueue] enqueueNotification: postingStyle:NSPostWhenIdle]
Run Code Online (Sandbox Code Playgroud)
因此推送不会发生在app循环的相同迭代中.但这没有任何区别,也没有试图推迟推送详细视图控件:
double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[[self.navigationController topViewController].navigationController pushViewController:detailController animated:YES];
});
Run Code Online (Sandbox Code Playgroud)
我不知道问题是什么或接下来要尝试什么,任何想法?
ios ×1