解决方案:在尝试在新项目中重新创建此错误以提交给 Apple 时,我发现它特定于 iPhone OS 2.1,并且为 2.2 编译修复了该问题。斯蒂芬,感谢您的帮助;我会接受你的回答,因为如果错误仍然存在或者我不愿意为 2.2 编译它会起作用。
我有一个应用程序从根本上改变了它的数据库模式,这种方式需要我将旧式记录转换为代码中的新式记录。由于用户可能会在此应用程序中存储大量数据,因此我尝试显示带有进度条的模态视图控制器,同时将数据移植过来(即,作为用户看到的第一件事)。这个视图控制器viewDidAppear:
开始一个数据库事务,然后启动一个后台线程来进行实际的移植,偶尔performSelectorInMainThread:withObject:waitUntilDone:
用来告诉前台线程更新进度条。
问题是,viewDidAppear:
被调用了两次。我注意到这一点是因为“启动事务”步骤失败并显示“数据库繁忙”消息,但设置断点表明它确实被调用了两次——一次是-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]
,一次是-[UIViewController modalPresentTransitionDidComplete]
。这些名称似乎是私有 UIViewController 方法,所以我猜这要么是一个框架错误,要么我正在做一些 UIKit 不希望我做的事情。
两个相关的代码摘录(一些不相关的代码已经总结):
- (void)applicationDidFinishLaunching:(UIApplication *)application {
(register some default settings in NSUserDefaults)
// doing this early because trying to present a modal view controller
// before the view controller is visible seems to break it
[window addSubview:[self.navigationController view]];
// this is the method that may present the modal view
[self.databaseController loadDatabaseWithViewController:self.navigationController];
if(!self.databaseController.willUpgrade) {
[self restoreNavigationControllerState];
}
}
从我的 DatabaseController 类:
- (void)loadDatabaseWithViewController:(UIViewController*)viewController {
(open the new database)
(compute the path the old database would live at if it existed)
if([[NSFileManager defaultManager] fileExistsAtPath:oldDBPath]) {
(open the old database)
[viewController presentModalViewController:self animated:NO];
}
}
那么,我在这里搞砸了什么,还是应该向 Apple 提交错误报告?