2012-05-09 83 views
40

我有一个模态故事板场景,我想让所有其他场景都可以使用。从我的故事板上的每个场景创建一个模态的细节,会造成大量的字符串无处不在。有没有办法让我离开赛场并以编程方式调用场景?以编程方式调用故事板场景(无需继续)?

基本上我想这样做:

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

除而不是创建和推视图控制器类,我想要做的一个模式转换到“分离的”(不与SEGUE连接)故事板场景。

回答

82

是的,你可以。做这样的事情来获得进入VC,那么就莫代尔推它:

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

这是否将场景推送为模态视图(就像使用模态赛格一样)? – zakdances

+1

这取决于你如何呈现它。使用[self presentModalViewController:myVC animated:YES];它会 – Darren

+0

谢谢。有一件事我很困惑......在第二行之后但在“presentModalViewController:myVC”行之前,myVC会发生什么?它只是坐在隐藏的背景中吗? – zakdances

17

在故事板中给你的视图控制器一个标识符(在属性检查器下),然后使用下面的代码来推进这个视图。

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

这似乎不是从AppDelegate中内调用时工作。 – radven

+0

@radven ViewControllers和他们的类不能从AppDelegate调用(我认为)... –

+1

@RazorSharp真的吗?我总是在AppDelegate中调用VC(根据需要)。例如(关闭我的头),设置根标签栏控制器时,我需要初始化标签中的视图控制器。现在,要显示内容,您需要在App Delegate展示根视图控制器/ storyboard等内部工作。 – chadbag

37

注:presentModalViewController的方法:动画被弃用的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]; 
+0

如果您想确保使用相同的故事板,也可以使用self.storyboard。 –

+0

您的第一行更详细一点。虽然目前** Modal ** ViewController:animated * is *弃用,替换方法是presentViewController:在方法名中间没有Modal的情况下动画。乍看起来可能并不清楚,因为功能调用看起来非常相似。 –

1

我认为,随着iOS7已经变得非常容易通过故事板

我目前正在学习贯彻关于iOS7中的新功能并发现了这个简单的解决方案,但它可能与以前的版本相关,我不确定。

首先你需要连接呈现VC和目标VC(这是唯一需要的连接),然后在故事板的属性检查器中选择风格为模态,在身份检查器中给你的VC一个storyboardID并确保你检查“使用storyboardID”复选框,

如果它不存在这个方法还没有添加到您的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:]方法,允许您在targetViewController出现之前进行上次修改。

+3

问题是“不需要继续”,因为“故事板创建了一大堆随处可见的字符串”。 –

+0

Thnx,你是对的。但我认为最初的问题是在iOS7发布之前发布的。 – supergegs

5

我有一个情况,我想从应用程序的主体部分呈现视图控制器,其中一个设置为&帮助&等。为了做到这一点,我希望它在导航控制器内,我们可以从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]; 
} 

在所提出的视图控制器(或导航控制器的子类),你可以有一个的UIBarButtonItem来,解散视图控制器的,像这样的整体呈现层次:

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

希望这帮助一群人。干杯。

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]; 
4

继承人斯威夫特版本的这个:

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

你也应该改变你的故事板ID是这样的: enter image description here

3

enter image description here只需调用使用导航控制器的视图控制器 将此代码写入视图控制器并设置storyboad中的viewcontroller在图像中设置。

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

继承人斯威夫特3版本:

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let viewController = storyboard.instantiateViewController(withIdentifier: "baseViewController") 
self.present(viewController, animated: true, completion: nil) 
相关问题