6

このサイトでいくつかの回答を試しましたが、どれも私の問題に関連していないようです

私が使用している 2 種類のセグエを持つ MasterDetail アプリがあります。詳細ビューでボタンを押すと、プッシュ セグエが使用され、別の詳細ビューがプッシュされます。新しい詳細ビュー (プッシュされたばかりのビュー) には、モーダル セグエを使用して別の UIView (フォーム シート) を呼び出すボタンがあります。

私がやろうとしているのは、ユーザーが行を選択すると、メッセージを表示する UIAlertView が表示され、同時に (同時にである必要はありません) UIViewcontroller (モーダル) を閉じて戻ることです。プッシュされたViewcontrollerから。基本的に、ビューが最初の元のメイン画面に戻るように、すべてのビューコントローラー、1 つのモーダル、1 つのプッシュ (ナビゲーション) を閉じることができる必要があります。

UIAlertView が正常に動作しており、使用してモーダルビューコントローラーを閉じることができますが[self.dismissViewControllerAnimated:YES completion:nil];、次のビューコントローラー (ナビゲーションコントローラーにあります) を閉じる方法がわかりません。これを使用する:[self.navigationController popToRootViewControllerAnimated:NO];動作しません。

すべてのビューを削除する関数を呼び出す場所は次のとおりです。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlWithIDAndChallenge];

    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    UIAlertView *message = [[UIAlertView alloc] initWithTitle@"Started" message:@"The challenge has begun!" delegate:nil cancelButtonTitle:@"OK!" otherButtonTitles:nil];

    [message show]

    //right here is where I would normally dismiss the modal VC
    //here is where I would like to dismiss all VC

}
4

3 に答える 3

15

必要に応じて、iOS 6.0 (およびそれ以降) のプロジェクトでは、アンワインド セグエを使用できます。たとえば、次のことができます。

  1. 最上位のビュー コントローラー (からアンワインドするコントローラーではなく、アンワインドしたいコントローラー)、アンワインド セグエ メソッドを記述します。セグエの目的地については、以下のステップ 3 に到達したときに明らかになる理由によります):unwindToTopLevel

    - (IBAction)unwindToTopLevel:(UIStoryboardSegue *)segue
    {
        NSLog(@"%s", __FUNCTION__);
    }
    
  2. アンワインドを開始する Interface Builder シーンでcontrol ⌘、ビュー コントローラー アイコンから終了アイコンまでドラッグして、アンワインド セグエを作成します。

    ここに画像の説明を入力

    通常、ボタンから出口アウトレットまでのセグエを定義します (これで完了です) が、セグエをプログラムで呼び出したい場合は、上記のように、コントローラーとアンワインド アウトレットの間にセグエを作成することをお勧めします。

  3. アンワインド セグエの名前を含む小さなポップアップが表示されます (提示しているコントローラーから...魔法のようです)。

    ここに画像の説明を入力

  4. そのセグエをプログラムで呼び出す場合は、IB ウィンドウの左側にあるドキュメント アウトラインでアンワインド セグエを選択する必要があります。選択が完了したら、アンワインド セグエにストーリーボード ID を指定できます。

    ここに画像の説明を入力

    私は通常、ストーリーボード ID にアンワインド セグエの名前を使用しますが、好きなものを使用できます。

  5. これで、アラート ビューでセグエを呼び出すことができます。

    - (IBAction)didTouchUpInsideButton:(id)sender
    {
        [[[UIAlertView alloc] initWithTitle:nil message:@"go home" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil] show];
    }
    
    #pragma mark - UIAlertViewDelegate
    
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
        if (buttonIndex != [alertView cancelButtonIndex])
        {
            [self performSegueWithIdentifier:@"unwindToTopLevel" sender:self];
        }
    }
    
于 2013-07-12T03:34:29.263 に答える
1

モーダルビューを提示したクラスから

モーダルの却下を呼び出し、少し遅れてセレクターを実行してから、

ここにサンプルコードがあります

//Write this in the class from where you presented a modal View.
//Call the function from modal class when you want to dismiss and go to root.
- (void) dismissAndGoToRoot {
      [self dismissViewControllerAnimated:YES completion:nil];
      [self performSelector:@selector(gotoRoot) withObject:nil afterDelay:0.50];
}

- (void)gotoRoot {

    [self.navigationController popToRootViewControllerAnimated:NO];
}

ここで関数を呼び出します

// ここで、通常はモーダル VC を却下します // ここで、すべての VC を却下します

[self.parentViewController dismissAndGoToRoot];

これが機能しない場合は、モーダル クラスで ParentViewController のインスタンス変数を取得し、モーダル ビュー コントローラーを提示するときに割り当てます。

于 2013-07-12T02:37:59.697 に答える
0

あなた[self.dismissViewControllerAnimated:YES completion:nil];

self dismissViewControllerAnimated:YES completion:^{
    [parentViewController.navigationController popToRootViewControllerAnimated:YES];
}

私は、parentViewController が表示中のビュー コントローラーを指し、ブロックによって親ビュー コントローラーのナビゲーション コントローラーがルート ビュー コントローラーにポップされると考えています。

于 2013-07-12T02:29:57.373 に答える