我正在尝试从不带segue
的Storyboard
内的UIViewController
加载UIView
。我创建了UIViewcontroller
,布局了所有内容,将其与特定类连接,并设置了Storyboard ID
。我还将元素连接到了类的h.file
,现在我正在寻找一种方法来初始化这个UIViewController
的subview
,而不使用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];
初始化后,我试图将特定UIViewController
中的一个UIViews
添加到我的实际视图中,但它不起作用。如果我只使用前两行,就不会发生任何事情,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
视图控制器,然后再添加子视图。
其次,如果您创建了segue,只需使用performSegueWithIdentifier:
方法来推送/呈现视图控制器(存在模态segue),并且在推送/展现视图控制器viewWillAppear/viewDidAppear
方法中,您可以添加子vew(不要在viewDidLoad
中这样做,因为视图的框架可能还没有正确设置)。
第三,如果您正在使用自动布局,您可能必须检查约束,并确保禁用从弹簧到自动布局的转换,因为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文件加载的,则不需要执行此操作。