在哪里以编程方式构建视图与使用nib

时间:2012-05-30 12:26:50

标签: ios uiview uiviewcontroller interface-builder nib

我已经搜索了很多东西,并通过几本教科书进行了挖掘,但我真正欣赏的是在iOS应用程序中定义UIView子类的最佳实践的简单解释。

  • 如果使用xib,我可以在运行开始时在哪里添加/调整控件?
  • 如果以编程方式构建,我应该在ViewController(loadView?)还是单独的UIView子类中执行此操作?如果是后者,我如何指定它的文件的owener,这样如果它被添加为子视图,它知道它的控制器是谁?
  • 你在awakeFromNib,loadView,viewDidLoad,UIView.init,UIViewController.init等中放置了什么?
  • 您经常使用哪些其他方法?

我不需要超级具体说明 - 我更希望找到一份快速参考指南,解释在每种可用方法中适用的代码类型。

3 个答案:

答案 0 :(得分:6)

我的做法是:

  • 在单独的文件中创建自定义 UIView 子类。
  • 在UIViewController的 init 中创建所有非UI对象
  • 在UIViewController的 loadView 中创建我的自定义UIView并将其设置为控制器的 self.view
  • 在UIViewController的 viewDidUnload (当内存警告时调用)释放所有UI组件(我的自定义UIView)
  • 在UIViewController的 dealloc 中发布所有非UI对象

在我的自定义UIView子类I中:

  • init 方法中创建所有子视图,并在 dealloc
  • 中发布 我在layoutSubviews中设置子视图的帧以确保,只有在更改时才设置帧。这是因为重新绘制子视图很昂贵:
if ( !CGRectEqualToRect(__subview.frame, rect) ) {
  __subview.frame = rect;
}

这就是我在所有UIViewControllers中所做的。我不使用IB,一切都是以编程方式创建的。

希望它有所帮助!

答案 1 :(得分:4)

  

如果使用xib,我可以在哪里添加/调整控件的开头   运行

在视图控制器的viewDidLoad中。

  

如果以编程方式构建,我应该在ViewController中执行此操作   (loadView?)或单独的UIView子类?如果是后者,我该怎么做   指定它的文件的owener,以便它被添加为子视图   知道它的控制器是谁?

同样,我总是在我的视图控制器的viewDidLoad中执行此操作。

  

你在awakeFromNib,loadView,viewDidLoad,UIView.init中放置了什么,   UIViewController.init等?

其中,我只担心viewDidLoad

  

您经常使用哪些其他方法?

  1. 确保为手动创建的控件使用自动调整大小遮罩,以确保它们正确处理用户界面方向。

  2. 永远不要假设(尽可能多)您的屏幕宽度为320pt。请务必参考您需要当前视图大小的self.view.size

  3. 如果您的控件无法通过自动调整大小的蒙版来处理用户界面方向更改,请务必使用iOS 5的viewWillLayoutSubviews进行调整。

答案 2 :(得分:0)

有一些非常简单的nib,如典型的MainWindow.nib,它们没有本地化内容,可以用一行代码重现。在这种情况下,代码比取消归档nib要快得多。

还有高度动态的布局,无法将其描述为笔尖。

您应该在每种特定情况下选择最方便有效的方式。总会有权衡,只需明智地选择。