2012-03-13 7 views
0

UITableViewCellのサブクラスからUIButtonを削除する際に問題が発生しました。このボタンは、セルが表ビューの最初のセルである場合にのみ追加されます。したがって、このボタンは無制限にすることも、UIButtonクラスのインスタンスにすることもできます。さらに、これらのセルはすべて同じ識別子を持つため、最初のセル(ボタン付き)が下に移動した場合があります。次に、このボタンを削除する必要があります。UITableViewCellからUIButtonを削除する

私は、このような方法でそれをやっている:

if(callBtn != nil) { 
    [callBtn removeFromSuperview]; 
} 

はしかし、それはアプリケーションのクラッシュの原因となります。

私は、この問題は最初のセルと他のセルで異なる識別子を使用することで解決できると思いますが、おそらくそれがより良い解決策です。しかし、私はこのコードが間違っているか、またはUITableViewCellのサブクラスからサブビューを削除する際に気をつけなければならないことを知りたいと思います。

@EDIT:ここ は、細胞が作成されているコードです:

if(withCallBtn == YES) { 
     callBtn = [[UIButton alloc] initWithFrame:CGRectZero]; 
     callBtn.tag = CALL_BUTTON_TAG; 
     [callBtn addTarget:self action:@selector(callBtnAction:) forControlEvents:UIControlEventTouchUpInside]; 

     // setting background, title, etc 

     [self.contentView addSubview:callBtn]; 
     [callBtn release]; 
    } 

挨拶、 アダム

+1

ボタンを追加したコードを表示します。おそらくあなたがそこでそれを上書きするでしょう。 –

+0

"ボタンコードの追加"というタイトルのコードはどこにありますか? removeCallBtnはどのように見えますか? スーパービューからボタンを削除すると、そのボタンはリリースされますが、callBtnはnilに設定されません。どちらかを実行し、スーパービューから削除する前にcallBtnを保持するか、削除するときに変数をnilに設定し、再度使用するときは再作成する必要があります。ここで完全なコードを投稿してください。どこかの論理的なエラーがあります。ところで、あなたはARCを使っていませんよね? –

+0

運がいいですか? – lnafziger

答えて

2

あなたのボタンがによって保持されている:ボタンのコードを追加

NSString *ident = @"HistoryCell"; 
HistoryItemCell *cell = (HistoryItemCell *)[tableView dequeueReusableCellWithIdentifier:ident]; 
// If there is no reusable cell of this type, create a new one 
if (!cell) { 
    if(indexPath.row == 0) { 
     cell = [[[HistoryItemCell alloc] initWithStyle:UITableViewCellStyleDefault withCallBtn:YES reuseIdentifier:ident] autorelease]; 
    } else { 
     cell = [[[HistoryItemCell alloc] initWithStyle:UITableViewCellStyleDefault withCallBtn:NO reuseIdentifier:ident] autorelease]; 
    } 
} else { 
    if(indexPath.row != 0) { 
     [cell removeCallBtn]; 
    } 
} 

History *history = [[[Store defaultStore] allHistories] objectAtIndex:indexPath.row]; 
[cell setDataFromModel:history]; 
return cell; 

その「スーパービュー」を削除し、ビューから削除すると、割り当て解除されます。削除する前にremoveFromSuperviewを呼び出す前に保持する必要があります(そうしないと、割り当てが解除された後に再度参照しないようにnilに設定します)。

したがって、私はこのようにコードを変更します

if(callBtn != nil) { 
    [callBtn removeFromSuperview]; 
    callBtn = nil; 
} 

をあなたが実際に(あなたがあなたの元のコードに持っているものではありません)周りの参照を保持したいなら、あなたはこれを使用します。

if(callBtn.superview != nil) { 
    [callBtn retain]; 
    [callBtn removeFromSuperview]; 
} 
関連する問題