2

もしこのサイトがなかったら、私は髪の毛がなく、おそらく今橋から飛び降りていたでしょう. わかった!私の問題:

xcode 4.4 でストーリーボードを使用しています。私は3つのView Controllerを持っています(実際には5つですが、他のものは無関係だと思います)。ビュー コントローラ A は、ビュー コントローラ B にプッシュします。ビュー コントローラ B のナビゲーション バーには、2 つのセグメントと戻るボタンを備えたセグメント化されたコントロールがあります。ビュー コントローラ B は、セグメント 1 が選択された状態でロードされます。ユーザーがセグメント 0 を選択すると、View Controller C がインスタンス化されます。最初のプッシュですべて順調です。A から B にプッシュされ、押し戻すと A にポップすることができます。私の問題は、ビュー コントローラー A を含む配列リストに popToViewController を入力すると、ポップしますが、アニメーション化されません。「Animate:YES ダミー!」というあなたの考えはよくわかります。しかし、アニメーションはそうです..ハァッ?これが私のコードです:

ビューコントローラーBで何が起こっているのか

-(IBAction)Previous:(id)sender{
[self.navigationController popViewControllerAnimated:YES];
}

- (IBAction)segmentSwitch:(id)sender;
{
if ([sender selectedSegmentIndex] == 0)
{
    MapViewController *controller = [self.storyboard           instantiateViewControllerWithIdentifier:@"Map"];
    [self.navigationController pushViewController:controller animated:NO];
}
else if ([sender selectedSegmentIndex] == 1) {
    ListViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"List"];
    [self.navigationController pushViewController:controller animated:NO];

}
}

ビューコントローラーCはこちら

-(IBAction)Previous:(id)sender
{
NSInteger index = -1;

ReportAppDelegate *appDelegate =
(ReportAppDelegate *)[[UIApplication sharedApplication]delegate];
MainOrangeTestViewController *orangeViewController = [appDelegate orangeViewController];

orangeViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Orange"];
NSArray* newVCarray = [[NSArray alloc] initWithObjects:orangeViewController, nil];
self.navigationController.viewControllers = newVCarray;

for(int i=0 ; i<[newVCarray count] ; i++)
{

    if([[newVCarray objectAtIndex:i] isKindOfClass:NSClassFromString(@"MainOrangeTestViewController")])
    {
        index = i;
    }
}
[self.navigationController popToViewController:[newVCarray objectAtIndex:index] animated:YES];



}
- (IBAction)segmentSwitch2:(id)sender; {
if ([sender selectedSegmentIndex] == 0)
{
    MapViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"Map"];
    [self.navigationController pushViewController:controller animated:NO];
}
else if ([sender selectedSegmentIndex] == 1)
{
   ListViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"List"];
    [self.navigationController pushViewController:controller animated:NO];
}
}

インスタンス化すると、そのView Controllerの新しいインスタンスを作成し、新しいnavスタック(またはそのようなもの)を作成していることがわかります。それと何か関係があるのではないかと考えています。それにもかかわらず、一体なぜポップをアニメーション化しないのでしょうか? 現在のビルドに何かを実装したいと思っていますが、再構築が必要な場合はそうしてください! どんな助けでも大歓迎です。私は間違いなくこれについて宿題をしましたが、解決策はありません。

事前にすべてに感謝します!

編集: ビュー コントローラー B から A に戻る最初の POP がアニメーション化されていることを追加する必要があります。ただし、セグメント化されたコントロールの切り替えを開始したときと、ビュー コントローラー C に切り替えたときに、ビュー コントローラー A に戻ってもポップはアニメーション化されません。したがって、最初に A から B にロードすると、アニメーションが成功してポップバックします。しかし、トグルの後、アニメーションなしで A に戻り、アニメーション化されたメソッドは YES です。

4

2 に答える 2

0

あなたの状況についてはまだ少し混乱していますが、もう 1 つのヒントがあります。事前に履歴を作成することができます。VC0 から VC2 にプッシュし、ポップするときに、VC2 から VC1 または VC0 にポップするとします。完全に実行可能:

// in VC0.m, animated push to VC2
// push to vc1 invisibly
[self.navigationController pushViewController:vc1 animated:NO];
// we've made history!  now push visibly to vc2
[self.navigationController pushViewController:vc2 animated:YES];

ポップバックする場所を選択するには...

// in VC2.m
if (/* user needs a regular pop back to VC1 */) {
    [self.navigationController popViewControllerAnimated:YES];
} else // pop back two, to VC0
    NSArray *viewControllers = [self.navigationController viewControllers];

    // we're not assuming that vc0 is the root here, the top of the navigation stack
    // is at index=count-1.  self is at the top.  a regular pop is just below == count-2.
    // two pops is at count-3, and so on.
    NSInteger backBackIndex = viewControllers.count - 3;

    // in case we get here by some other pushing path, worst case pop is to the root
    backBackIndex = MAX(backBackIndex, 0);

    UIViewController *backBackVC = [viewControllers objectAtIndex:backBackIndex];
    [self.navigationController popToViewController:backBackVC animated:YES];
}
于 2012-09-19T15:33:55.660 に答える
0

A->B->C をプッシュしてから、B をスキップしてもう一度 A に戻ろうとしているだけですか? その場合、ナビゲーション コントローラーの viewControllers プロパティを変更する必要はありません。

// in vcC.m ...

-(IBAction)Previous:(id)sender
{
    [self.navigationController popToRootViewControllerAnimated:YES];
}

クラス リファレンスでさまざまな種類の pop を確認してください。1 つ戻るか、ルートにポップするか、履歴にある特定の VC にポップすることができます。これを行う方法は、viewControllers スタックを読み取り(書き込むのではなく)、ポップ先の VC を見つけてから、コード内の popTo... メソッドを使用することです。

しかし、 popToRoot が必要なようです。

于 2012-09-19T04:00:15.297 に答える