0

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

UIView 将由以下组件组成:

  1. UI搜索栏
  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 的框架。

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

这是一个正确的设计吗?

我可以按以下方式在 layoutSubviews 中单独添加 _tableView 吗?

-(void)layoutSubViews{

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

}
4

2 回答 2

1

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

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

@implementation CustomViewController

- (void)loadView {
    customView = [[CustomView alloc] initWithFrame:CGRectZero];

    customView.tableView.dataSource = self;
    customView.tableView.delegate = self;
}

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

于 2013-02-08T09:43:53.203 回答
1

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

于 2013-02-08T09:31:05.377 回答