web-dev-qa-db-ja.com

プログラムでView Controllerを呼び出す方法は?

私はこれで見つけることができるすべてのチュートリアルを見てきましたが、まだ答えがありません。コードから別のビューを呼び出す必要があります。 UIStoryboardsを使用しています。 UIButtonsからコントロールドラッグすることでビューを何度も変更しましたが、今ではコードからのものでなければなりません。ユーザーがアプリを初めて開いた場合、メインメニューから情報ページを呼び出そうとしています。ただし、コードからビューを変更する方法を見つけることはできません。私のすべてのビューは同じファイルによって制御されます(ViewController2)。メインメニューのidentifierViewControllerMainであり、情報ページのidentifierViewControllerInfoです。最初にこれを試しました:

[ViewControllerMain presentViewController: ViewControllerInfo 
                                 animated:YES 
                               completion: NULL];

次に、それぞれに異なるUIViewControllersを作成して、次のように言ってみました。

[ViewController2 presentViewController: ViewController 
                              animated:YES 
                            completion: NULL];

どちらも機能しませんでした。最初のものについては、それは言います:

宣言されていない識別子ViewControllerMainの使用。

2番目の例では、次のように述べています。

予期しないインターフェイス名「ViewController」:予想される識別子。

私に何ができる?

66
Samuel Noyes

View Controllerを作成するには:

UIViewController * vc = [[UIViewController alloc] init];

View Controllerを呼び出すには(別のViewController内から呼​​び出す必要があります):

[self presentViewController:vc animated:YES completion:nil];

1つには、nullではなくnilを使用します。


ストーリーボードからView Controllerをロードする:

NSString * storyboardName = @"MainStoryboard"; 
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER_OF_YOUR_VIEWCONTROLLER"];
[self presentViewController:vc animated:YES completion:nil];

View ControllerのIdentifierは、View Controllerのクラス名と同じか、ストーリーボードのIDインスペクターで割り当てることができるストーリーボードIDのいずれかです。

131

Swift

これにより、ストーリーボードからView Controllerが取得され、表示されます。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController = storyboard.instantiateViewController(withIdentifier: "secondViewControllerId") as! SecondViewController
self.present(secondViewController, animated: true, completion: nil)

ストーリーボード名、View Controller名、View Controller IDを必要に応じて変更します。

20
Suragch

ストーリーボードからView Controllerをインスタンス化してから表示する必要があります。

ViewControllerInfo* infoController = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerInfo"];
[self.navigationController pushViewController:infoController animated:YES];

この例では、前のビューに戻るためにNavigation Controllerがあることを前提としています。もちろんpresentViewController:animated:completion:を使用することもできます。主なポイントは、ストーリーボードでターゲットView ControllerのIDを使用してターゲットView Controllerをインスタンス化することです。

20
tigloo

NavigationControllerを使用する場合は、この方法でViewControllerを呼び出すことができます

enter image description here

1。現在の画面:新しい画面を読み込む

VerifyExpViewController *addProjectViewController = [[VerifyExpViewController alloc] init];
[self.navigationController pushViewController:addProjectViewController animated:YES];

2.1ロード済みビュー:.hファイルに以下を追加

@interface VerifyExpViewController : UIViewController <UINavigationControllerDelegate>

2.2ロード済みビュー:.mファイルに以下を追加

  @implementation VerifyExpViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.navigationController.delegate = self;
    [self setNavigationBar];
}
-(void)setNavigationBar
{
    self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
    self.navigationController.navigationBar.translucent = YES;
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"B_topbar.png"] forBarMetrics:UIBarMetricsDefault];
    self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};
    self.navigationItem.hidesBackButton = YES;
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Btn_topback.png"] style:UIBarButtonItemStylePlain target:self action:@selector(onBackButtonTap:)];
    self.navigationItem.leftBarButtonItem.tintColor = [UIColor lightGrayColor];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Save.png"] style:UIBarButtonItemStylePlain target:self action:@selector(onSaveButtonTap:)];
    self.navigationItem.rightBarButtonItem.tintColor = [UIColor lightGrayColor];
}

-(void)onBackButtonTap:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];
}
-(IBAction)onSaveButtonTap:(id)sender
{
    //todo for save button
}

@end

これが誰かに役立つことを願っています:)

5
swiftBoy

これを行うには2つの方法があります。

1、ここでの私の答えで説明されているように、ストーリーボードでViewControllerにセグエを作成します: iOS 5のユーザー入力に関連しないセグエを実行する方法?

2、ViewControllerと識別子を与えて、私の答えのコードを使用して呼び出します: ストーリーボードのシーンをプログラムで(セグエを必要とせずに)呼び出しますか?

3
Darren

このis_の背後にある主要なロジック、

NSString * storyboardIdentifier = @"SecondStoryBoard";

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardIdentifier bundle: nil];

UIViewController * UIVC = [storyboard instantiateViewControllerWithIdentifier:@"YourviewControllerIdentifer"];

[self presentViewController:UIVC animated:YES completion:nil];
1
        UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_iOS7" bundle:nil];
            AccountViewController * controller = [storyboard instantiateViewControllerWithIdentifier:@"accountView"];
            //            [self presentViewController:controller animated:YES completion:nil];

        UIViewController *topRootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
        while (topRootViewController.presentedViewController)
        {
            topRootViewController = topRootViewController.presentedViewController;
        }

        [topRootViewController presentViewController:controller animated:YES completion:nil];
0
suresh

表示するView Controllerクラスをインポートし、次のコードを使用します

KartViewController *viewKart = [[KartViewController alloc]initWithNibName:@"KartViewController" bundle:nil];
[self presentViewController:viewKart animated:YES completion:nil];
0
vijeesh