78

誰かが私に最初にモーダルビューコントローラーを提示し、次にそれを却下するために使用できるサンプルコードを教えてもらえますか?これは私が試していることです:

NSLog(@"%@", blue.modalViewController);
[blue presentModalViewController:red animated:YES];
NSLog(@"%@", blue.modalViewController);
[blue dismissModalViewControllerAnimated:YES];
NSLog(@"%@", blue.modalViewController);

このコードはviewDidLoadにあります(「青」と「赤」はどちらもUIViewControllerのサブクラスです)。赤いビューを表示してすぐに非表示にし、アニメーションを表示することを期待しています。ただし、このコードはモーダルビューのみを表示し、それを却下しません。何か案が?最初のログは「null」を示し、他の2つのログは「null」を示します<RedViewController: 0x3d21bf0>

もう1つのポイントは、このコードをapplicationDidFinishLaunchingに配置すると、赤いビューがまったく表示されず、すべてのログが「null」になることです。

4

6 に答える 6

110

まず、そのコードを applicationDidFinishLaunching に配置すると、Interface Builder からインスタンス化されたコントローラーがまだアプリケーションにリンクされていない可能性があります (したがって、「赤」と「青」はまだnilです)。

しかし、最初の質問に答えるために、あなたが間違っているのはdismissModalViewControllerAnimated:、間違ったコントローラーで呼び出していることです! 次のようになります。

[blue presentModalViewController:red animated:YES];
[red dismissModalViewControllerAnimated:YES];

通常、「赤」のコントローラーは、ある時点 (おそらく「キャンセル」ボタンがクリックされたとき) で自分自身を却下することを決定する必要があります。次に、「赤」コントローラーは次のメソッドを呼び出すことができますself

[self dismissModalViewControllerAnimated:YES];

それでもうまくいかない場合は、コントローラーがアニメーション形式で表示されるという事実に関係している可能性があるため、表示後すぐにコントローラーを閉じることができない可能性があります。

于 2009-10-07T13:19:04.407 に答える
20

迅速

Swift 3 用に更新

ここに画像の説明を入力

絵コンテ

それぞれにボタンを持つ 2 つの View Controller を作成します。2 番目のビュー コントローラーでは、クラス名をSecondViewControllerに、ストーリーボード ID を に設定しsecondVCます。

コード

ViewController.swift

import UIKit
class ViewController: UIViewController {

    @IBAction func presentButtonTapped(_ sender: UIButton) {
        
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let myModalViewController = storyboard.instantiateViewController(withIdentifier: "secondVC")
        myModalViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
        myModalViewController.modalTransitionStyle = UIModalTransitionStyle.coverVertical
        self.present(myModalViewController, animated: true, completion: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {
    
    @IBAction func dismissButtonTapped(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }
}

ソース:

于 2016-05-17T10:59:12.360 に答える
13

xcode 4.52で疲れた最も簡単な方法は、追加のビューを作成し、セグエモーダルを使用してそれらを接続することでした(ボタンをビュー1から2番目のビューにドラッグし、モーダルを選択します)。次に、ボタンを2番目のビューまたは作成したモーダルビューにドラッグします。このボタンを制御してヘッダーファイルにドラッグし、アクション接続を使用します。これにより、controller.mファイルにIBactionが作成されます。コードでボタンのアクションタイプを見つけます。

[self dismissViewControllerAnimated:YES completion:nil];
于 2013-01-18T07:04:58.183 に答える
9

presentModalViewController:

MainViewController *mainViewController=[[MainViewController alloc]init];
[self.navigationController presentModalViewController:mainViewController animated:YES];

dismissModalViewController:

[self dismissModalViewControllerAnimated:YES];
于 2012-09-05T12:18:19.770 に答える
3

これを行う最も簡単な方法は、ストーリーボードとセグエを使用することです。

TabBarControllerのFirstViewController(Navigation Controllerではない)からログインUIを使用してLoginViewControllerにSegueを作成し、「showLogin」という名前を付けます。

ユーザーがログインしたか、セッションが有効かどうかを検証するためにBOOLを返すメソッドを作成します...できればAppDelegateで。isSessionValidと呼びます。

FirstViewController.mで、メソッドviewDidAppearを次のようにオーバーライドします。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if([self isSessionValid]==NO){
        [self performSegueWithIdentifier:@"showLogin" sender:self];
    }
}

次に、ユーザーが正常にログインした場合は、LoginViewControllerを閉じるかポップアウトして、タブを表示します。

100%動作します!

それが役に立てば幸い!

于 2012-11-28T21:28:26.987 に答える
3

迅速

self.dismissViewControllerAnimated(true, completion: nil)

于 2015-09-08T16:20:37.567 に答える