2

解像度:新しいプロジェクトでこのバグを再作成して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にバグレポートを提出すべきですか?

答えて

3

私もこのアプリを見ました。

  1. 負荷ルートビュー
  2. ロードモーダルビュー
  3. OSビューを送信
  4. ステップ1でビューの通知を表示されなかったを:私はそれを完全に確認したが、私は、これは何が起こっているかだと思いますが、やったことがなかったです現在の View Controller(このインスタンスではDatabaseControllerクラス)は、これをピックアップします
  5. OSがビューを送信しました。モーダルビューの通知が表示されました
  6. T現在のView Controllerは通知を受け取ります。この場合、前回と全く同じコントローラーです

私の場合、最初の呼び出しで起こったことをちょうどviewDidAppear:にリセットします。

あなたのケースでは、2つの選択肢があります:既にアップグレードを開始したかどうかを追跡する静的変数。または開始する前に渡されたパラメータUIView*を見てください。

+0

上記のように、私は最終的にOS 2.2で修正されたことを発見しましたが、あなたの提案に感謝します。 –

+0

問題ありません。 "本当の"答えを見るのは素晴らしいです! –

関連する問題