0

カスタムUIView、MyViewがあり、その中にいくつかのテーブルビュー(tv1とtv2)があり、両方ともプログラムで追加されています。

loadView で MyView のインスタンスを作成するカスタム UIViewController、MyController があります。

私の目標は次のとおりです。myView は myView.tv1 のデータ ソースおよびデリゲートである必要があります。これは、データ モデルに触れておらず、静的であるためです。

myView.tv2 の内容はデータソースに依存するため、myController は myView.tv2 のデリゲートである必要があります。

各ヘッダーに次を追加しました。

@interface MyController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@interface MyView : UIView <UITableViewDelegate, UITableViewDataSource>

必要なデリゲート メソッドをそれぞれに追加しました。

MyView の init で、そのテーブル ビューを追加し、最初のデリゲートを self に設定します。

tv1 = [[UITableView alloc] initWithFrame:frame1 style:UITableViewStyleGrouped];
tv1.delegate = self;
tv1.datasource = self;

tv2 = [[UITableView alloc] initWithFrame:frame2 style:UITableViewStyleGrouped];

そして、コントローラーで 2 番目のテーブルビューを接続します。

- (void)loadView{
self.view = [[MyView alloc] initWithFrame:myFrame];
[(MyView *)self.view tv2].delegate = self;
[(MyView *)self.view tv2].dataSource = self;
}

これを実行すると、ランタイム エラーが大量に発生します。ページング コントロールについて不平を言うこともあれば、NSCFArray について不平を言うこともあれば、テキストがまったくないこともあります。それは常にクラッシュします。

問題の原因はデリゲートではなく、データソースの設定にあると判断しました。laodView でデータソース行をコメント アウトすると、正常に実行されます (ただし、もちろんコンテンツはありません)。

毎回異なる実行時エラーが発生する原因は何ですか? どこで問題が発生している可能性がありますか?

4

1 に答える 1

0

myViewは、myView.tv1のデータソースおよびデリゲートである必要があります。これは、myViewがデータモデルに影響を与えず、静的であるためです。

それは実際にはMVCではありませんよね?

テーブルごとに個別の組み合わせたデリゲートとデータソースクラスを用意しておけば、問題をより迅速に追跡できる(または簡単に回避できる)と思います。データソースはのtable1内部クラスである可能性がありますMyView

テーブルはそれ自体を保持しないため、デリゲート/データソース参照をテーブル所有者が保持することが非常に重要です(デリゲート/データソースをselftable1(MyView)とtable2( MyController)ですが、個別のデリゲートとデータソースクラスを作成する場合は、この点に注意する必要があります)。とにかくarray、データソースとして使用しているものを保持する必要があります。

于 2012-05-28T22:26:31.480 に答える