1

uitableviewに取り組んでいますが、uitableviewcell内でカスタムuiviewcontrollerを使用すると、ランダムにクラッシュします。

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell){
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    SuspectSalesResponse* r = [valueArray objectAtIndex:indexPath.row];
    SuspectSalesCellViewController* scellView = [[SuspectSalesCellViewController alloc]initWithNibName:@"SuspectSalesCellViewController" bundle:nil cellData:r];
    if(![cellViewArray containsObject:scellView])        
       [cellViewArray addObject:scellView];
    [cell.contentView addSubview:scellView.view];

}
return cell;

このコードは機能する場合もあれば、次のエラーが発生する場合もあります。

* -[SuspectSalesHeaderViewController _parentModalViewController]:割り当て解除されたインスタンス0x8556880に送信されたメッセージ

contentviewsを配列(cellViewArray)内に保持しようとしましたが、運が悪かったのですが、それでもこのエラーが発生します。私は何が間違っているのですか?

助けてくれてありがとう!

4

1 に答える 1

3

問題は、テーブルセル内にViewControllerを追加することを想定していないことです。UIViewControllerからに変更してみてくださいUIView

クラッシュの正確な理由は、(ビューを持つ)コントローラーを作成し、セルにビューを追加しているが、コントローラーオブジェクトが失われていることです。ビューがその親コン​​トローラーに通知を送信すると、コントローラーは既に割り当てが解除されており、アクセスが不適切な場所があります。SuspectSales~これは、をUIViewサブクラスに変換すると解決されます

編集nibファイルから(または任意のサブクラス) をロードするにはUIView、最初にxibを作成し、ビューのクラスをクラスに設定する必要があります(Interface Builderの3番目のタブで行います)。

その後、次のコードでロードできます。

一部のユーティリティクラスのジェネリック関数

+ (id)loadNibNamed:(NSString *)nibName ofClass:(Class)objClass {
    if (nibName && objClass) {
        NSArray *objects = [[NSBundle mainBundle] loadNibNamed:nibName owner:nil options:nil];

        for (id currentObject in objects ){
            if ([currentObject isKindOfClass:objClass])
                return currentObject;
        }
    }

    return nil;
}

あなたのクラスでは:

Subclass *view = [UtilityClass loadNibNamed:@"Subclass" ofClass:[Subclass class]];
于 2013-01-28T13:35:15.467 に答える