分段表不稳定

时间:2011-06-11 01:53:29

标签: iphone cocoa-touch uitableview

我有一个表,其内容使用基于附加的分段控件的值提供的两个数据集之一填充。数据来自网络。

当我在两个数据集之间来回移动然后选择一个表格单元格时,应用程序崩溃。当我使用两个单独的表而不是具有分段控件的单个表时,应用程序可以毫无打扰地工作。以某种方式组合它们会使应用程序不稳定。

最大的错误之一就是当我点击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];
    }
}

2 个答案:

答案 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的值,尽管在这种情况下不太可能。