我有一个模态故事板场景,我希望所有其他场景都可以访问。从我的故事板上的每个场景创建一个模态segue会产生一大堆乱七八糟的字符串。有没有办法让我离开segue并以编程方式调用场景?
基本上我想做这样的事情:
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
[self presentModalViewController:myNewVC animated:YES];
除了创建和推送视图控制器类之外,我想做一个模态转换到“隔离”(不与segue连接)故事板场景。
答案 0 :(得分:85)
是的,你可以。做这样的事情来访问VC,然后只是模态推送它:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
MyNewViewController *myVC = (MyNewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"myViewCont"];
答案 1 :(得分:40)
注意:iOS 6中不推荐使用 presentModalViewController:animated 方法。
新代码应为:
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];
答案 2 :(得分:19)
在storyboard中为视图控制器提供一个标识符(在Attributes Inspector下),然后使用以下代码将该视图转发。
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"STORYBOARDNAME" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"VIEWCONTROLLERIDENTIFIER"];
[self presentModalViewController:vc animated:YES];
答案 3 :(得分:5)
我有一个案例,我想从应用程序的主要部分呈现一个视图控制器,一个设置&帮助&等等。要做到这一点,我希望它在一个导航控制器中,我们可以从UIBarButtonItem调用一个小插件模块。
现在,这可能是在当前的故事板中,或者在另一个故事板中,这没关系。
我想这样做,因为我厌恶我的故事板上的segue line spaghetti的潜力。
这是怎么做的。
- (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];
}
在呈现的视图控制器中(或在导航控制器的子类中),您可以使用UIBarButtonItem来关闭整个呈现的视图控制器层次结构,如下所示:
- (IBAction)dismissThisVC:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
希望这可以帮助一群人。欢呼声。
答案 4 :(得分:4)
这是一个Swift版本:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let myVC = storyboard.instantiateViewControllerWithIdentifier("myStoryId")
self.presentViewController(myVC, animated: true, completion: nil)
答案 5 :(得分:3)
致电导航至其他班级
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];
答案 6 :(得分:3)
只需使用导航控制器调用viewcontroller 在viewcontroller中编写此代码,并在storyboad中设置viewcontroller,如图中所示。
ProfileVC *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ProfileVC"];
[self.navigationController pushViewController:vc animated:YES];
答案 7 :(得分:1)
我认为通过iOS7,通过故事板实现它变得非常容易
我目前正在学习iOS7中的新功能并找到了这个简单的解决方案,但即使在以前的版本中它也可能是相关的,我不确定。
首先你需要将呈现VC连接到目标VC(这是唯一需要的连接),然后在故事板的属性检查器中选择要模态的样式,在身份检查器中为VC提供storyboardID并确保检查'使用storyboardID'复选框,
如果尚未将此方法添加到您的presentationVC:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
YourTargetVC * targetVC =
(YourTargetVC *)segue.destinationViewController;
if(nil != targetVC) {
//Do preparations here
}
}
现在,当您希望从presentationVC展示您的targetVC时,您可以使用:
[self performSegueWithIdentifier:(NSString *) sender:(id)];
其中标识符是viewController的storyboardID,发件人是触发操作的视图,此方法将调用storyboard场景,因此将调用[prepareForSegue: sender:]
方法,允许您在targetViewController之前进行最后修改出现。
答案 8 :(得分:0)
Heres Swift 3版本:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "baseViewController")
self.present(viewController, animated: true, completion: nil)