在viewDidLoad中调用addSubView时的奇怪行为

时间:2014-08-09 13:31:41

标签: ios objective-c ios7

我在IB中创建了UIView,当我将其添加到UIViewController中的viewDidLoad时,视图的背景颜色更改为clearColor按钮不可点击(他们不接受触摸)。如果我尝试在代码中设置背景颜色没有任何反应。它看起来像这样:

enter image description here

但是,如果我在viewWillAppear中运行完全相同的代码,它会正常显示,并且可以像这样点击:

enter image description here

代码很简单,是viewDidLoad中唯一的代码(我已经删除了那里的所有其他代码以查看是否存在问题):

[myView setFrame:CGRectMake(0, 0, 320, 30)];
[self.view addSubview:myView];

我试过调用bringSubviewToFront但没有做任何事情。有什么想法吗?

其他一些注意事项:

  • UIView与视图控制器的主视图位于同一个NIB中,并通过IBOutlet连接。

  • NIB文件是与视图控制器分开创建的 初始化调用initWithNibName

  • 我在NIB文件中设置了自定义类和视图插座以匹配视图控制器。

  • 关闭NIB文件的

  • 的Autolayout
  • 没有故事板

2 个答案:

答案 0 :(得分:4)

这里没有足够的信息确切知道,但我的猜测是你的控制器被设置为扩展顶部栏后面的视图。我不相信像topLayoutGuide等自动布局的内容会在viewDidLoad之后计算出来。

可能的解决方案:

  • 如果您不需要,请取消选中视图控制器上的“在顶栏下延伸边缘”框。

  • viewDidLoad中添加视图,但将其放在viewDidLayoutSubviews

  • 使用自动布局约束定位myView,而不是明确设置其框架。

答案 1 :(得分:2)

问题在于,我们在viewDidLoad添加视图时不知道该怎么做。仅仅知道它在viewWillAppear中有效是不够的。当它没有出现时,我们必须知道它的状态。为实现这一目标,我提出:

在盲人中调试UIView的提示

实现以下(通常是组合)可以帮助诊断常见问题的来源。

存在

  • 设置断点。它击中了吗?
  • 视图是否为非nil
  • 是否已添加到超级视图中?
  • superview非零吗?
  • superview是否有-window

可见性

  • -hidden吗?
  • superview -clipsToBounds
  • 让视图更大。你现在能看到吗?
  • 让它变得很多。现在怎么样?
  • 将其中心设置为superview的中心。
  • 让它变为亮绿色。
  • 确保-alpha为1-ish。

层次

  • 视图是子类吗?股票UIView是否有效?
  • 是否使用类别扩展了任何视图类?
  • 视图控制器生命周期方法(viewDidLoadviewWillAppearviewDidLayoutSubviews等)是否与视图混乱?
  • 您的视图控制器是否应该在super等所有位置调用viewDidLoad

遏制

  • 您的视图控制器是否包含在其上方的另一个视图控制器(例如,UINavigationControllerUITabBarController等)?
  • 您的视图控件-wantsFullscreenLayout
  • -edgesForExtendedLayout是否有边缘?
  • 您是否可以尝试在收容之外自行渲染视图控制器?

自动布局

  • 您是否在日志/术语中遇到任何约束一致性错误?
  • 您是否设置了宽度/高度(或内在尺寸)?
  • -translatesAutoresizingMaskIntoConstraints设置得恰当吗?

的Xcode

  • 你清理过你的项目并重建了吗?
  • 你有"重置内容和设置......"在模拟器中?
  • 您是否尝试过模拟器和设备?
  • 你退出Xcode并重新开始吗?
  • 您是否关闭了计算机并重新开始?
  • 您是否处于测试阶段?停止。

最小可行再现

  • 如果您使用全新视图和视图控制器创建一个新项目,问题是否仍然存在?
  • 如果您复制并粘贴笔尖/故事板?
  • 如果您复制并粘贴课程?

当他们来找我时,我会添加更多。