web-dev-qa-db-ja.com

プログラムでストーリーボードシーンを呼び出します(セグエを必要としません)?

モーダルストーリーボードシーンがあり、他のすべてのシーンにアクセスできるようにします。ストーリーボードのすべてのシーンからモーダルセグエを作成すると、至る所に文字列の混乱が生じます。セグエを止めて、代わりにプログラムでシーンを呼び出す方法はありますか?

基本的に私はこのようなことをしたい:

  MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
  [self presentModalViewController:myNewVC animated:YES];

view Controllerクラスを作成してプッシュする代わりに、「隔離された」(セグエに接続されていない)ストーリーボードシーンへのモーダルトランジションを行います。

42
zakdances

はい、できます。 VCにアクセスするにはこのようなことをしてから、モーダルプッシュしてください:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
MyNewViewController *myVC = (MyNewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"myViewCont"];
85
Darren

注:メソッドpresentModalViewController:animatedはiOS 6で廃止されました。

新しいコードは次のようになります。

NSString * storyboardName = @"MainStoryboard_iPhone";
NSString * viewControllerID = @"ViewID";
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
MyViewController * controller = (MyViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
[self presentViewController:controller animated:YES completion:nil];
40
Charles Wilson

ストーリーボードで、View Controllerに識別子(Attributes Inspectorの下)を付け、次のコードを使用してそのビューを前面に表示します。

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"STORYBOARDNAME" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"VIEWCONTROLLERIDENTIFIER"];
[self presentModalViewController:vc animated:YES];
19
Jeremy1026

アプリのメイン部分からView Controllerを表示したい場合があります。設定とヘルプなどがあります。これを行うには、ナビゲーションバーコントローラー内に配置する必要があります。これは、UIBarButtonItemから呼び出すことができる小さなプラグインモジュールのようなものです。

さて、これは現在のストーリーボードへ/からでも、別のストーリーボードでも構いません。

このようにしたいのは、ストーリーボード全体にセグエラインスパゲッティの可能性が嫌いだからです。

方法は次のとおりです。

- (IBAction)displaySettings:(id)sender
{
    LOG_SELECTOR() // google that for extra goodness

    // FYI, this can be done using a different storyboard like so.
    /*
     NSString * storyboardName = @"MainStoryboard_iPhone"; // possibly use device idiom?
     UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
     */

    // To Push a new set of scenes with a new Navigation Controller, it is done like this:
    UINavigationController *settingsNC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings Nav Controller"];
    OBSettingsUIViewController *settingsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings root"];
    [settingsNC pushViewController:settingsVC animated:NO];

    [settingsNC setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];

    // Present the view controller;
    [self presentViewController:settingsNC animated:YES completion:NULL];
}

提示されたView Controller(またはNavigation Controllerのサブクラス)では、UIBarButtonItemを使用して、提示されたView Controllerの階層全体を次のように閉じることができます。

- (IBAction)dismissThisVC:(id)sender {
     [self dismissViewControllerAnimated:YES completion:nil];
}

これが多くの人々の助けになることを願っています。乾杯。

5
Alex Zavatone

Heres a Swiftこれのバージョン:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let myVC = storyboard.instantiateViewControllerWithIdentifier("myStoryId")
self.presentViewController(myVC, animated: true, completion: nil)

ストーリーボードIDも次のように変更する必要があります。 enter image description here

4
Esqarrouth

他のクラスに移動するための呼び出し

UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];

UINavigationController *navController = (UINavigationController *)window.rootViewController;

DumpFeed *dump = [storyboard instantiateViewControllerWithIdentifier:@"DumpFeed"];

dump.isPushed=YES;

dump.strUserId = appDelegate.strFriendid;


[navController pushViewController:dump animated:YES];
3
Bhushan_pawar

enter image description here Navigation Controllerを使用してViewControllerを呼び出すだけで、このコードをviewcontrollerで記述し、storyboadでviewcontrollerを画像の設定として設定します。

ProfileVC *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ProfileVC"];
        [self.navigationController pushViewController:vc animated:YES];
3

IOS7では、ストーリーボードを介した実装が非常に簡単になったと思います

私は現在iOS7の新機能について学んでおり、この簡単なソリューションを見つけましたが、以前のバージョンでも関連していたかもしれません。

最初に、提示するVCとターゲットVC(唯一の接続が必要))を接続する必要があります。次に、ストーリーボードの属性インスペクター内で、モーダルにするスタイルを選択します、IDインスペクターでVCにストーリーボードIDを指定し、[ストーリーボードIDを使用]チェックボックスをオンにしていることを確認します。

まだ存在しない場合、このメソッドをpresentingVCに追加します。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

   YourTargetVC * targetVC = 
         (YourTargetVC *)segue.destinationViewController;

   if(nil != targetVC) {

       //Do preparations here
   }

}

現在、presentingVCからtargetVCを表示したい場合は、次を使用できます。

[self performSegueWithIdentifier:(NSString *) sender:(id)];

ここで、識別子はviewControllerのstoryboardIDであり、送信者はアクションをトリガーしたビューです。このメソッドはストーリーボードシーンを呼び出すため、[prepareForSegue: sender:]メソッドが呼び出され、uがtargetViewControllerが表示される前に最後の変更を行えるようにします。

1
supergegs

Heres Swift 3バージョン:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "baseViewController")
self.present(viewController, animated: true, completion: nil)
0
Pankaj Gaikar