【问题标题】:Should we add UITableView in initializer or layoutsubviews method in iOS?我们应该在 iOS 的初始化程序或 layoutsubviews 方法中添加 UITableView 吗?
【发布时间】:2013-02-08 09:28:41
【问题描述】:

我正在为我的应用设计一个自定义 UIView。

UIView 将包含以下组件:

  1. UISearchbar
  2. UITableView

我的初始化程序如下:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        _searchBar = [[UISearchBar alloc]initWithFrame:CGRectZero];
        _tableView = [[UITableView alloc]initWithFrame:CGRectZero];
        _tableView.dataSource = self;
        [super addSubView:_searchBar];
        [super addSubView:_tableView];
        // Initialization code
    }
    return self;
}

我打算在layoutsubviews方法中设置_searchBar和_tableView的frame。

但我认为我将 _tableView 添加到 super 的方式是错误的。因为在 _tableView 添加到子视图的那一刻,_tableView 的数据源方法就会被触发。这甚至发生在自定义类本身的创建之前。

这是一个正确的设计吗?

我可以像下面这样在 layoutSubviews 中单独添加 _tableView 吗?

-(void)layoutSubViews{

//Adjust frame 
[_tableView removeFromSuperView];
[self addSubView:_tableView];

}

【问题讨论】:

    标签: ios uiview customization layoutsubviews


    【解决方案1】:

    您不应该在视图中分配 UITableViewDataSource。它应该在 ViewController 中分配。

    你是对的。对此没有任何限制。但你的问题是关于设计的。想象一下这样的事情:

    @implementation CustomViewController
    
    - (void)loadView {
        customView = [[CustomView alloc] initWithFrame:CGRectZero];
    
        customView.tableView.dataSource = self;
        customView.tableView.delegate = self;
    }
    

    使用 ViewController,您可以控制何时初始化自定义视图并控制其 tableView 何时加载数据。虽然您当然可以将所有这些代码放入您的 customView 中,但您会遇到比您现在询问的问题更严重的问题。

    【讨论】:

    • 没有这个限制
    • 你绝对可以这样做,但你不应该这样做。视图不应该处理逻辑或数据。他们应该展示给他们的东西。
    • 我有一个疑问......当我们打开这样的类的内部时,使用它的开发人员有可能使用在这个类中组成的视图或控件的框架?禁止用户这样做好不好?
    • 是的。任何人都可以修改视图框架或视图中的控件。没有必要禁止对此的访问。首先,因为您不能禁止访问视图的框架,其次,您想要 viewController 来访问视图控件。如果 viewController 无权访问 view 的控件,它就违背了 viewController 的目的。
    • 你绝对应该在这里阅读“模型-视图-控制器设计模式”部分:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
    【解决方案2】:

    您绝对应该在 init 中添加它,因为每次您调整视图大小时都会调用布局子视图,并且需要重新布局其子视图。 布局子视图方法严格用作回调,告诉您您的视图将进行布局,并用作您希望制作的任何其他布局的覆盖点。 另外,作为附加说明,使用 super 添加视图并不是一个好的设计。

    【讨论】:

    • 为什么我们不应该添加super?我们可以添加如下吗?[self addSubView:tableView];但是这里由于数据源是在初始化器中设置的,所以数据源方法会被触发对吗?
    • 在 self 的超类实现中使用 add 子视图,为什么要从这里添加到 super ?它只会让事情变得更加复杂。是的,仍然会调用数据源回调,但是,建议在控制器而不是视图中设置数据源和委托处理。视图严格地做布局/绘图/与UI层相关的事情,而控制器处理内容/逻辑/与业务层相关的事情等。你的方法不符合MVC模式。
    • +1 感谢 Vlad 的澄清..我赞成你的回答和评论..我发现 rocky 的答案最适合我..我接受它..
    猜你喜欢
    • 2012-02-29
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 2011-01-28
    相关资源
    最近更新 更多