0

アプリのカスタム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のフレームを設定することを計画しています。

しかし、私が_tableViewをsuperに追加した方法は間違っていると思います。_tableViewがサブビューに追加された瞬間に、_tableViewのデータソースメソッドがトリガーされるためです。そして、これはカスタムクラス自体が作成される前でも発生します。

これは正しいデザインですか?

以下のように、layoutSubviewsに_tableViewだけを追加できますか?

-(void)layoutSubViews{

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

}
4

2 に答える 2

1

ビューのサイズが変更されるたびにレイアウトサブビューが呼び出され、そのサブビューを再レイアウトする必要があるため、必ずinitに追加する必要があります。Layout subviewsメソッドは、ビューがレイアウトされることを通知するコールバックとして厳密に使用され、作成する追加のレイアウトのオーバーライドポイントとして使用されます。また、補足として、スーパーを使用してビューを追加するのは良いデザインではありません。

于 2013-02-08T09:31:05.377 に答える
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 に答える