解像度:新しいプロジェクトでこのバグを再作成してAppleに提出すると、iPhone OS 2.1固有のものであり、問題。スティーブン、助けてくれてありがとう。私はあなたの答えを受け入れるでしょう。なぜなら、バグがまだ存在していた場合、あるいは私が2.2のためにコンパイルするつもりはなかったからです。viewDidAppear:起動時に表示されるモーダルビューコントローラで2回呼び出される
私は根本的に、コードの新しいスタイルのものに古いスタイルのレコードを変換するために私を必要とする方法で、そのデータベースのスキーマを変更しているアプリを持っています。ユーザーはこのアプリケーションに大量のデータを保存する可能性があるため、データをポーティングしながら(つまり、ユーザーが最初に見たように)進捗バーを持つモーダルビューコントローラーを表示しようとしています。このビューコントローラのviewDidAppear:
は、データベーストランザクションを開始し、実際の移植を行うバックグラウンドスレッドを開始します。performSelectorInMainThread:withObject:waitUntilDone:
を使用して、進行状況バーを更新するようにフォアグラウンドスレッドに指示します。
問題は、viewDidAppear:
が2回呼び出されています。私はこれに気付きました。 "トランザクションを開始する"ステップは "データベースビジー"メッセージで失敗しますが、ブレークポイントを設定すると実際には-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]
で2回、さらに-[UIViewController modalPresentTransitionDidComplete]
で2回呼び出されます。これらの名前は私的な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にバグレポートを提出すべきですか?
上記のように、私は最終的にOS 2.2で修正されたことを発見しましたが、あなたの提案に感謝します。 –
問題ありません。 "本当の"答えを見るのは素晴らしいです! –