这是我第一次使用连接到自定义委托和数据源的UITableView。直到今天,我曾经连接到“自我”。这个问题的前提是here。
所以,我还有两个额外的UIViews。使用分段控件我把一个过去提到的UIViews放在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 dataSource必须从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];
}
我的错误是什么?提前谢谢。
答案 0 :(得分:3)
您使用dequeue
正在cell
dequeueReusableCellWithIdentifier
cell
。如果队列中没有UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
{
cell = [[UITableViewCell alloc] init];
}
会发生什么?绝对崩溃。
所以你需要分配一个单元格,也加上这一行:
{{1}}
答案 1 :(得分: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;
}
因为通过这样做,如果你不能将一个单元格出列,那么你就是在创建一个单元格。
答案 2 :(得分:0)
当在滚动tableView时重用单元格时,dequeueReusableCellWithIdentifier将返回UITableViewCell实例。
所以添加
if (nil == cell)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
您必须使用initWithStyle:reuseIdentifier:这是tableview单元格的指定初始值设定项。