0

这是我第一次处理连接到自定义委托和数据源的 UITableView。直到今天,我还是连接到“自我”。这个问题的前传在这里

所以,我有两个额外的 UIView。使用分段控制,我将上面提到的 UIView 之一放在 self.view 上...

创建了两个 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 数据源必须从 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使用cell. dequeueReusableCellWithIdentifier如果队列中没有cell,会发生什么?肯定崩溃。

所以你需要分配一个单元格,也添加这一行:

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 将返回 UITableViewCell 实例,当单元格在通过 tableView 滚动时被重用。

所以添加

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

您必须使用 initWithStyle:reuseIdentifier: 这是 tableview 单元格的指定初始化程序。

于 2012-08-23T18:54:39.033 回答