モーダルストーリーボードシーンがあり、他のすべてのシーンにアクセスできるようにします。ストーリーボードのすべてのシーンからモーダルセグエを作成すると、至る所に文字列の混乱が生じます。セグエを止めて、代わりにプログラムでシーンを呼び出す方法はありますか?
基本的に私はこのようなことをしたい:
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
[self presentModalViewController:myNewVC animated:YES];
view Controllerクラスを作成してプッシュする代わりに、「隔離された」(セグエに接続されていない)ストーリーボードシーンへのモーダルトランジションを行います。
はい、できます。 VCにアクセスするにはこのようなことをしてから、モーダルプッシュしてください:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
MyNewViewController *myVC = (MyNewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"myViewCont"];
注:メソッド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];
ストーリーボードで、View Controllerに識別子(Attributes Inspectorの下)を付け、次のコードを使用してそのビューを前面に表示します。
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"STORYBOARDNAME" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"VIEWCONTROLLERIDENTIFIER"];
[self presentModalViewController:vc animated:YES];
アプリのメイン部分から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];
}
これが多くの人々の助けになることを願っています。乾杯。
他のクラスに移動するための呼び出し
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];
Navigation Controllerを使用してViewControllerを呼び出すだけで、このコードをviewcontrollerで記述し、storyboadでviewcontrollerを画像の設定として設定します。
ProfileVC *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ProfileVC"];
[self.navigationController pushViewController:vc animated:YES];
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が表示される前に最後の変更を行えるようにします。
Heres Swift 3バージョン:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "baseViewController")
self.present(viewController, animated: true, completion: nil)