从故事板内的UIViewController加载UIView不起作用

时间:2013-11-18 11:38:09

标签: ios objective-c uiviewcontroller storyboard

我正在尝试从UIViewUIViewController加载Storyboard segue而不UIViewcontroller。我创建了Storyboard ID,包含了所有内容,将其与特定类连接起来并设置了h.file。我还将元素连接到我班级的subview,现在我正在寻找一种方法来初始化UIViewController segue而不是UIViewController。我一直在搜索并发现很多帖子以这种方式加载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]; 一样添加它也不起作用:

UIViews

初始化后,我尝试将特定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]; 。有什么想法吗?


我也试过

{{1}}

3 个答案:

答案 0 :(得分:1)

应该是

[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来正确定位。

答案 1 :(得分:0)

首先,如果您使用

从故事板初始化UIViewController
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    pointVC = (PointsViewController *)[storyboard instantiateViewControllerWithIdentifier:@"PointsViewController"];

这只会初始化视图控制器,排序alloc/init方法。因此,如果您尝试将视图添加为视图控制器视图的子视图,此时它将无法工作,因为视图控制器的视图尚未加载。您必须首先push/present/addChild视图控制器,然后添加子视图。

其次,如果您创建了segues,只需使用performSegueWithIdentifier:方法推送/显示视图控制器(有模态segue),并在您推送/呈现的视图控制器viewWillAppear/viewDidAppear方法中添加subivew(不要在viewDidLoad中执行,因为视图的框架可能尚未正确设置)。

第三,如果您使用自动布局,则可能必须检查约束并确保禁用从弹跳到自动布局的转换,因为addSubview将启用该转换。

答案 2 :(得分:0)

元素全部为零的原因是仅在显示视图后才加载元素。您可以强制它加载元素。这对我有用:

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

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

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

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