7

我进行了很多搜索,并翻阅了几本教科书,但我真正欣赏的是对在 iOS 应用程序中定义 UIView 子类的最佳实践的简单解释。

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

我不需要超级具体的说明——我更多的是寻找一个快速参考指南,它解释了每种可用方法中的代码类型。

4

3 回答 3

6

我的做法是:

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

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

  • 在init方法中创建所有子视图并在dealloc中释放它
  • 在 layoutSubviews 我以这种方式设置子视图的框架以确保仅在更改时才设置框架。这是因为重绘子视图很昂贵:
if ( !CGRectEqualToRect(__subview.frame, rect) ) {
  __subview.frame = rect;
}

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

希望能帮助到你!

于 2012-05-30T19:05:32.340 回答
4

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

viewDidLoad视图控制器中。

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

同样,我也总是在viewDidLoad我的视图控制器中这样做。

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

其中,我只担心viewDidLoad

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

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

  2. 永远不要假设(像许多人那样)你的屏幕是 320pt 宽。始终参考self.view.size您需要当前视图大小的位置。

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

于 2012-05-30T14:03:50.210 回答
0

有非常简单的 nib,例如典型的 MainWindow.nib,它们没有本地化内容,只需一行代码即可复制。在这种情况下,代码比解压 nib 快得多。

还有一些无法用笔尖描述的高度动态的布局。

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

于 2012-05-30T15:28:05.313 回答