从故事板中的UIViewController加载一个UIView不起作用

我想加载一个UIView从我的Storyboard内的UIViewController没有segue 。 我创build了UIViewcontroller ,将所有内容都进行了UIViewcontroller ,并将其与特定的类相关联,并设置了一个Storyboard ID 。 我也将元素连接到我的类的h.file ,现在我正在寻找一种方法来初始化这个UIViewControllersubview没有segue 。 我一直在search,并find了很多这样加载UIViewController的post:

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil]; pointVC = (PointsViewController *)[storyboard instantiateViewControllerWithIdentifier:@"PointsViewController"]; 

尝试像这样添加视图,视图跳转到下一个UIViewController

 pointVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentViewController:pointVC animated:YES completion:NULL]; 

addChildViewController一样添加它也不起作用:

 [self addChildViewController:pointVC]; 

初始化后,我尝试添加一个特定的UIViewController里面的UIViewController到我的实际视图,但它不工作。 如果我只是使用前两行,没有发生任何事情, UIViewController对象里面没有UIViews ,因为viewDidLoad永远不会被调用。 有任何想法吗?


我也试过了

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil]; pointVC = (PointsViewController *)[storyboard instantiateViewControllerWithIdentifier:@"PointsViewController"]; [self addChildViewController:pointVC]; [self.view addSubview:pointVC.viewPointsDialog]; [pointVC didMoveToParentViewController:self]; 

它应该是

 [self.view addSubview:pointVC.view]; 

代替

 [self.view addSubview:pointVC.viewPointsDialog]; 

所以最终的工作代码应该是这样的:

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil]; pointVC = (PointsViewController *)[storyboard instantiateViewControllerWithIdentifier:@"PointsViewController"]; [self addChildViewController:pointVC]; [self.view addSubview:pointVC.view]; [pointVC didMoveToParentViewController:self]; 

您可以使用pointVC.view上的setFrame来正确定位它。

首先,如果你从故事板使用初始化一个UIViewController

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil]; pointVC = (PointsViewController *)[storyboard instantiateViewControllerWithIdentifier:@"PointsViewController"]; 

这只会初始化视图控制器, alloc/init方法。 所以,如果你试图添加一个视图作为视图控制器视图的子视图,在这一刻,它将无法工作,因为视图控制器的视图尚未加载。 您必须先push/present/addChild视图控制器,然后添加子视图。

其次,如果你已经创build了segues,只需使用performSegueWithIdentifier:方法来推送/呈现视图控制器(有模态segue),在你的推送/呈现视图控制器viewWillAppear/viewDidAppear方法,你可以添加subivew(不要这样做在viewDidLoad因为视图的框架可能还没有正确设置)。

第三,如果你正在使用自动布局,你可能需要检查约束,并确保禁用从popup到自动布局的转换,因为addSubview将启用该转换。

元素全部为零的原因是仅在要显示视图之后才加载元素。 你可以强制它加载元素。 这是什么为我工作:

 UIViewController *vC = [[UIStoryboard storyboardWithName:@"ViewControllers" bundle:nil] instantiateViewControllerWithIdentifier:@"MyViewController"];` vC.view.frame = self.view.frame; 

然后您可以显示或显示视图:

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

我必须为从故事板加载的任何视图控制器执行此操作。 如果视图控制器是从nib或xib文件加载的,则不需要执行此操作。