新视图控制器的 iOS addSubview 不起作用

Posted

技术标签:

【中文标题】新视图控制器的 iOS addSubview 不起作用【英文标题】:iOS addSubview of a new view controller does not work 【发布时间】:2015-07-16 15:54:44 【问题描述】:

我正在尝试做这样的事情 -

- (void)viewDidLoad 
  [super viewDidLoad];    
  ThingViewController *thingViewController = [self thingControllerForCard:self.card];
  thingViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
  UIView *view = [thingViewController view];
  [self.view addSubview:view];

它只是给我一个白屏,里面什么都没有。如果我在导航堆栈上推送新的视图控制器,它会正确显示控制器。知道我可能缺少什么吗?

【问题讨论】:

你不应该只是将一个 VC 的视图添加到另一个视图控制器 - 你需要告诉两个 VC 他们有一个子/父视图控制器。相关方法调用在 Apple 的 View Controller Programming Guide 中的Implementing a Custom Container View Controller 中进行了描述。 【参考方案1】:

您应该在viewDidLayoutSubviews 上设置thingViewController 框架。 viewDidLoad 此时没有正确设置帧:

- (void)viewDidLoad 
    [super viewDidLoad];    
    ThingViewController *thingViewController = [self thingControllerForCard:self.card];
    UIView *view = [thingViewController view];
    [self.view addSubview:view];


- (void)viewDidLayoutSubviews 
    [super viewDidLayoutSubviews];

    thingViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

【讨论】:

这是在正确的轨道上,但 viewDidLayoutSubviews 确实是视图控制器布局子视图的正确位置。 viewDidLayoutSubviews 将被调用,例如,如果视图的框架发生变化。 viewWillAppear 仅在视图添加到视图层次结构时被调用。 已更新,感谢@rschmidt。有趣的是,我喜欢使用 viewDidLayoutSubviews 进行框架设置,不知道为什么我忘记了。

以上是关于新视图控制器的 iOS addSubview 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

keywindow 在 ([[[UIApplication sharedApplication] keyWindow] addSubview:myView];) iOS 6 中不起作用

iOS 7 addSubview 为我的 UIView 添加了额外的长度,这是为啥呢?

复合视图的 addSubview 不起作用

addSubview与呈现模式ViewController之间的区别?

viewDidLoad() 中的 addSubView() 和 bringSubViewToFront() 不起作用

UINavigationBar 外观 addSubview 在 iOS 8 中不起作用