2010-12-03 22 views
3

UINavigationControllerを使用してiPhoneアプリケーションに問題があります。私はpushNavigationControllerを使用しているとき、それは正常に動作します。 iPhoneは、次のViewControllerに切り替えながらアニメーションを行います。しかし、ViewControllerの配列とsetViewControllersメソッドを使用すると、アニメーションに不具合が生じ、アニメーションのバグがはっきりと見えるようになります。iPhoneでUINavigationControllerのsetViewControllerを使用しても正しく動作しません。

次のスニペットがルートViewControllerで呼び出されます。条件に応じて、ViewController1に切り替えるか、ViewController2に直接移動する必要があります。後者の場合、ユーザーはvc1に戻ってからルートに戻ることができます。

NSMutableArray* viewControllers = [NSMutableArray arrayWithCapacity:2]; 
// put us on the stack 
[viewControllers addObject:self]; 
// add first VC 
AuthentificationViewController* authentificationViewController = 
    [[[AuthentificationViewController alloc] initWithNibName:@"AuthentificationViewController" bundle:nil] autorelease]; 
[viewControllers addObject:authentificationViewController]; 

if (someCondition == YES) 
{ 
UserAssignmentsListViewController* userAssignmentsListViewController = 
     [[[UserAssignmentsListViewController alloc] initWithNibName:@"UserAssignmentsOverviewViewController" bundle:nil] autorelease]; 

[viewControllers addObject:userAssignmentsListViewController]; 
} 

[self.navigationController 
    setViewControllers:[NSArray arrayWithArray:viewControllers] animated:YES]; 

ご覧のとおり、2番目のVCを配列に追加し、最後にnavigationControllerスタックをアニメーションで設定します。これは、最初のコントローラのみを追加すると正しく動作します。しかし、アニメーションが2番目のコントローラーに行かなければならない場合、ナビゲーションバーのタイトルは「飛んでいく」ことはありません。代わりに、アニメーションが終了するまで空のタイトルがあります。さらに悪いことに、ナビゲーションバーのタイトルをカスタムボタンに置​​き換えると、このボタンはアニメーションが終了するまで左上隅に表示されます。それはかなりのバグです。

私は、複数のpushViewControllerメソッドで回避策を使用しようとしましたが、アニメーションが正しく表示されない/感じられません。 pushViewControllerと同じ方法でアニメーションを実行したいここでの唯一の違いは、VCを追加するのではなく、スタック全体を一度に設定することです。ここに別の回避策がありますか?これはフレームワークのバグと見なすことができますか?私はVC2のためだけにpushNavControllerを使用することを考えていましたが、何とかVC1をスタックに挿入しましたが、それは可能ではないようです。

すべてのヒントやアドバイスありがとうございます。 :-)

テクニカルデータ:4.0用にコンパイルしているiOS 4.2を使用しています。

+0

解決策を見つけましたか?はいの場合は、共有してください。私は同様のアニメーションの問題に直面している。 – Pria

+0

いいえ、pushNavigationControllerの通常の動作と同じように機能するソリューションではありません。私はまだVCと呼び出しsetViewControllersの両方を追加しますが、2番目のVCは最初にナビゲーションバーのタイトルを持っていません。私は、アニメーションが終了した後に(私の場合はタイトルボタンです)設定します。とても良く見えませんが、うまくいきます。 – qwertfisch

答えて

5

最後に解決策が見つかりました。間違いは、アニメーションが完了するまで、新しいトップレベルのNavigationControllerが初期化されずに適切にロードされていないことでした。私の場合、UserAssignmentsListViewControllerにはviewDidLoadメソッドがあり、アニメーションが完了するまで呼び出されませんが、ナビゲーションタイトル(ここではUIButton)が設定されます。したがって、アニメーションは失敗します。

解決策は、すでに初期化されているビューコントローラをスタックにプッシュすることを意味します。だから、どこかで私たちのトップレベルVCを初期化:スタックに二つ以上のVCを押すと次に、トップレベル1がすでに初期化されている

// initialize our top-level controller 
ViewController* viewController2 = [[[ViewController alloc] 
    initWithNibName:@"ViewController" bundle:nil] autorelease]; 

とアニメーションの作品を(私の元の質問から一例を以下):

NSMutableArray* viewControllers = [NSMutableArray arrayWithCapacity:2]; 
// put us on the stack, too 
[viewControllers addObject:self]; 

ViewController* viewController1 = [[[ViewController alloc] 
    initWithNibName:@"ViewController" bundle:nil] autorelease]; 
[viewControllers addObject:viewController1]; 

if (someCondition == YES) 
{ 
    [viewControllers addObject:viewController2]; 
} 

[self.navigationController 
    setViewControllers:[NSArray arrayWithArray:viewControllers] animated:YES]; 
関連する問題