4

UINavigationControllerを使用しているiPhoneアプリで問題が発生しています。pushNavigationControllerを使用している場合は、正常に機能します。iPhoneは、次のViewControllerに切り替えながらアニメーションを実行します。ただし、ViewControllersの配列とsetViewControllersメソッドを使用すると、アニメーションに不具合が発生し、はっきりと見えるアニメーションのバグに発展する可能性があります。

次のスニペットは、ルート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];

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

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

すべてのヒントとアドバイスをありがとう。:-)

技術データ:iOS 4.2を使用しており、4.0用にコンパイルしています。

4

1 に答える 1

6

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

解決策は、スタックにプッシュするときに、既に初期化されているビュー コントローラーを参照することです。トップレベルの VC をどこかで初期化します。

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

次に、2 つ以上の VC をスタックにプッシュすると、最上位の VC が既に初期化されており、アニメーションが機能します (元の質問の例に従ってください)。

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];
于 2011-06-15T14:47:56.867 に答える