从情节提要中的 UIViewController 加载 UIView 不起作用



我正在尝试从不带segueStoryboard内的UIViewController加载UIView。我创建了UIViewcontroller,布局了所有内容,将其与特定类连接,并设置了Storyboard ID。我还将元素连接到了类的h.file,现在我正在寻找一种方法来初始化这个UIViewControllersubview,而不使用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文件加载的,则不需要执行此操作。

最新更新