0

カスタムデリゲートとデータソースに接続された UITableView で作業するのはこれが初めてです。今日まで、私は「自分」とつながっていました。この質問の前日譚はこちらです。

したがって、2 つの追加の UIView があります。セグメント化されたコントロールを使用して、上記の UIViews の 1 つを self.view に配置しました...

2 つの UITableView サブクラスを作成し、それらをデリゲートとデータソースとして設定しました。正常に動作し、漏れやクラッシュはありません。クラスが segmentedControl インデックスの変更で初期化されるかどうかを確認しました。

- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
    // Custom initialization
    NSLog(@"Nominals got init");
}
return self;
}

NSLog は、セグメントを変更するときに機能します。

質問:

カスタム デリゲート クラスでは、UITableViewDelegate および UITableViewDataSource プロトコルに必要なメソッドをオーバーライドします。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
UILabel *lbl=[[UILabel alloc]initWithFrame:CGRectMake(12, 12, 200, 12)];
lbl.text=@"some nominal";
cell.textLabel.text=@"Nominal";
[cell addSubview:lbl];

return cell;
}

現時点では例外が発生しています:

キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

さて、私のカスタム委譲クラスのセルは、私が作成した UITableView の同じセルではありませんか?

-(void)populateNominals:(int)subCountryID
{
NominalsTableViewDelegate *del=[[NominalsTableViewDelegate alloc]init];
[self setNominalsDelegate:del];


UITableView *nominalsTableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 372) style:UITableViewStylePlain];

[nominalsTableView setDelegate:nominalsDelegate];
[nominalsTableView setDataSource:nominalsDelegate];
[nominalsTableView reloadData];
[self.nominalsView addSubview:nominalsTableView];

}

私の間違いは何ですか?前もって感謝します。

4

3 に答える 3

3

を使用しようとdequeueしています。キューに何もない場合はどうなりますか? 間違いなくクラッシュします。celldequeueReusableCellWithIdentifiercell

したがって、セルを割り当てる必要があるため、次の行も追加します。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
{
 cell = [[UITableViewCell alloc] init];
}
于 2012-08-23T18:37:44.567 に答える
1

tableView:cellForRowAtIndexPath: メソッドでは、デキューするセルがない場合がありません。あなたのコードを見てください:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UILabel *lbl=[[UILabel alloc]initWithFrame:CGRectMake(12, 12, 200, 12)];
    lbl.text=@"some nominal";
    cell.textLabel.text=@"Nominal";
    [cell addSubview:lbl];

    return cell;
}

次のようにする必要があります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!cell) {
        cell = [[UITableViewCell alloc] init];
    }

    UILabel *lbl=[[UILabel alloc]initWithFrame:CGRectMake(12, 12, 200, 12)];
    lbl.text=@"some nominal";
    cell.textLabel.text=@"Nominal";
    [cell addSubview:lbl];

    return cell;
}

そうすることで、セルをデキューできない場合は、新しいセルを作成しているためです。

于 2012-08-23T18:42:05.397 に答える
0

dequeueReusableCellWithIdentifier は、tableView のスクロール中にセルが再利用されているときに UITableViewCell インスタンスを返します。

だから追加

if (nil == cell)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

テーブルビューセルの指定された初期化子である initWithStyle:reuseIdentifier: を使用する必要があります。

于 2012-08-23T18:54:39.033 に答える