我有一个表,其内容使用基于附加的分段控件的值提供的两个数据集之一填充。数据来自网络。
当我在两个数据集之间来回移动然后选择一个表格单元格时,应用程序崩溃。当我使用两个单独的表而不是具有分段控件的单个表时,应用程序可以毫无打扰地工作。以某种方式组合它们会使应用程序不稳定。
最大的错误之一就是当我点击A表的Acells时,在加载时我点击了段index = 1,这将加载B.它会导致无法识别的选择器被发送。参数的含义o要发送到B表的表。
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier0;
if (choice == 0) {
CellIdentifier0 = @"ACell";
} else if (choice == 1) {
CellIdentifier0 = @"BCell";
}
UITableViewCell *cell;
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier0];
if (cell == nil) {
if (choice == 0) {
[[NSBundle mainBundle] loadNibNamed:@"ACell" owner:self options:nil];
cell = ACell;
self.ACell = nil;
} else if (choice == 1) {
[[NSBundle mainBundle] loadNibNamed:@"BCell" owner:self options:nil];
cell = BCell;
self.BCell = nil;
}
}
if (choice == 0) {
[(ACell *)cell setA:(A*)[contentArray objectAtIndex:indexPath.row]];
} else if (choice == 1) {
[(BCell *)cell setB:(B*)[contentArray objectAtIndex:indexPath.row]];
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ( choice == 0) {
A = [contentArray objectAtIndex:indexPath.row];
[[NSNotificationCenter defaultCenter] postNotificationName:@"showA" object:A];
} else if (choice ==1) {
B = [contentArray objectAtIndex:indexPath.row];
[[NSNotificationCenter defaultCenter] postNotificationName:@"showB" object:B];
}
}
答案 0 :(得分:0)
检查选择拼写
if (choicee==0) {
[[NSBundle mainBundle] loadNibNamed:@"ACell" owner:self options:nil];
cell = ACell;
self.ACell = nil;}
else if (choice==1) {
答案 1 :(得分:0)
假设ACell
在加载nib文件时具有保留值,执行self.ACell = nil;
将释放旧值并将ACell
设置为nil
。现在,旧值是cell
指向的值。所以在技术上它会指向垃圾,因为它会被释放,因为ACell
是保留对象的唯一变量。你可以通过替换来解决这个问题,
cell = ACell;
用,
cell = [[ACell retain] autorelease];
作为旁注,您正在使用didSelectRowAtIndexPath:
方法} else if (choice = 1) {
。请务必使用==
而不是=
,这将始终评估为true,同时更改choice
的值,尽管在这种情况下不太可能。