【问题标题】:How do I create iOS app views programmatically如何以编程方式创建 iOS 应用程序视图
【发布时间】:2013-04-01 15:25:46
【问题描述】:

我正在编写一个应用程序,但没有使用故事板/xib 来创建视图,并且不确定放置我的视图设置代码的最佳位置。我尝试了几种不同的方法,但我不确定将视图设置代码与控制器代码分开的最佳方法。

到目前为止我尝试过的方法是:

  1. 将我所有的视图设置代码(创建和定位按钮/标签)等放在控制器 viewDidLoad 方法中。我很确定这是一种糟糕的做事方式,因为您最终会在控制器中使用大量代码。

  2. 子类化UIView 并在initWithFrame 方法中设置界面元素。然后,我要么将此视图添加到我的视图控制器视图之上。

    _customView = [[CustomView alloc] initWithFrame:self.view.frame];
    _customView.customLabel.text = @"Foo";
    [self.view addSubView:_customView]
    

或者我将控制器视图指定为我的customView

_customView = [[CustomView alloc] initWithFrame:self.view.frame];
self.view = _customView;
_customView.customLabel.text = @"Foo";

在尽量让这个问题保持非主观的同时,是否有以编程方式创建 iOS 界面的最佳实践?这些方法中的任何一种都是保持视图代码和控制器代码分离和可重用的好方法吗?

【问题讨论】:

  • 您需要重用该代码吗?如果是,则可以为 UIView 子类化或创建类别扩展。在这种情况下,我更喜欢子类。
  • 是的,我们的目标是让代码尽可能地可重用和干净。我认为子类化效果很好,我只是不确定使用子类化视图的最佳方式。也许任何一种方式都可以。

标签: iphone ios objective-c uiview uiviewcontroller


【解决方案1】:

如果您只需要使用该视图一次,请将代码留在viewDidLoad 方法中。也许您可以移动在控制器中以特定方法创建视图所需的代码。

- (void)viewDidLoad
{
    [super viewDidLoad];

    // other code here...
    [self createView];
}

此外,如果您的视图将是控制器的view,您还可以考虑覆盖loadView 方法并将代码放在那里。来自 Apple 文档。

您可以覆盖此方法以手动创建视图。 如果您选择这样做,请将视图层次结构的根视图分配给 视图属性。

如果您需要多次实例化您的视图,我将继承 UIView 并使用委托模式与您的控制器进行通信。

如果您选择这种方法,您需要覆盖layoutSubviews 方法以在您的视图中排列子项。

可以在How To Make a Custom UIView in iOS 5: A 5 Star Rating View 中找到一个明显的例子。

【讨论】:

  • 好的,我知道这是最简单的方法,但它不会导致您拥有“胖”控制器并违反 iOS 应用程序使用的 MVC 设计模式吗?
  • @AFraser 不,你继承了 UIView 而不是 UIViewController。它们是不同的东西。
  • @AFraser 恕我直言,这种方法非常干净。你子类化一个视图。您与具有 delagate 的控制器进行通信。你的评论是什么意思?
  • 对不起,我完全同意你的子类化方法。我指的只是将所有视图设置代码留在 UIViewController 类中。
  • @AFraser 在这种情况下,您可以利用类别扩展
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多