iOS:以编程方式显示视图控制器

时间:2013-04-22 17:08:24

标签: ios objective-c uiviewcontroller uistoryboard presentviewcontroller

我正在使用presentViewController:animated:completion:方法转到另一个视图控制器。

这是我的代码:

AddTaskViewController *add = [[AddTaskViewController alloc] init];
[self presentViewController:add animated:YES completion:nil];

此代码转到另一个UIViewController,但另一个控制器为空。我一直在使用故事板,但现在我需要在代码中完成。

9 个答案:

答案 0 :(得分:47)

如果您使用的是故事板,则可能不应该使用allocinit来创建新的视图控制器。相反,请查看您的故事板并找到您要执行的 segue ;它应该有一个唯一的标识符(如果没有,你可以在右侧边栏中设置一个)。

找到该segue的标识符后,向当前视图控制器发送-performSegueWithIdentifier:sender消息:

[self performSegueWithIdentifier:@"mySegueIdentifier" sender:self];

这将导致故事板实例化AddTaskViewController,并以您为该segue定义的方式呈现它。


另一方面,如果您根本没有使用故事板,那么您需要为AddTaskViewController提供某种用户界面。最常见的方法是使用nib初始化控制器:而不是仅调用init,您将调用-initWithNibName:bundle:并提供包含add-task的.xib文件的名称UI:

AddTaskViewController *add = [[AddTaskViewController alloc]
                              initWithNibName:@"AddTaskView" bundle:nil];
[self presentViewController:add animated:YES completion:nil];

(还有其他(不常见的)获取与新视图控制器关联的视图的方法,但这可能会给您带来最少的工作麻烦。)

答案 1 :(得分:31)

如果你正在使用Storyboard并且你的“添加”viewController在storyboard中,那么在设置中为你的“add”viewcontroller设置一个标识符,这样你就可以这样做:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"NameOfYourStoryBoard" 
                                                     bundle:nil];
AddTaskViewController *add = 
           [storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"];

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

如果你没有在storyboard或nib文件中添加“add”viewController,并希望以programmaticaly方式创建整个事物,那么appDocs会说:

  

如果无法在故事板或nib文件中定义视图,请覆盖loadView方法以手动实例化视图层次结构并将其分配给视图属性。

答案 2 :(得分:2)

您需要从故事板身份检查器设置故事板ID

 AddTaskViewController *add=[self.storyboard instantiateViewControllerWithIdentifier:@"storyboard_id"];
 [self presentViewController:add animated:YES completion:nil];

答案 3 :(得分:1)

您的代码:

 AddTaskViewController *add = [[AddTaskViewController alloc] init];
 [self presentViewController:add animated:YES completion:nil];

这段代码可以转到另一个控制器,但你得到一个新的viewController,而不是你的故事板的控制器,你可以这样做:

AddTaskViewController *add = [self.storyboard instantiateViewControllerWithIdentifier:@"YourStoryboardID"];
[self presentViewController:add animated:YES completion:nil];

答案 4 :(得分:1)

最好的方法是

AddTaskViewController * add = [self.storyboard instantiateViewControllerWithIdentifier:@"addID"];
[self presentViewController:add animated:YES completion:nil];

答案 5 :(得分:0)

以下是如何在Swift中执行此操作:

let vc = UIViewController()
self.presentViewController(vc, animated: true, completion: nil)

答案 6 :(得分:0)

尝试以下方法:

NextViewController *nextView = [self.storyboard instantiateViewControllerWithIdentifier:@"nextView"];
[self presentViewController:nextView animated:YES completion:NULL];

答案 7 :(得分:0)

试试这段代码:

[self.navigationController presentViewController:controller animated:YES completion:nil];

答案 8 :(得分:-1)

LandingScreenViewController *nextView=[self.storyboard instantiateViewControllerWithIdentifier:@"nextView"];
[self presentViewController:nextView animated:YES completion:^{}];