2012-03-13 2 views
0

UITableViewCell의 하위 클래스에서 UIButton을 제거하는 데 문제가 있습니다. 이 단추는 셀이 테이블보기의 첫 번째 셀인 경우에만 추가됩니다. 따라서이 버튼은 아무 것도 없거나 UIButton 클래스의 인스턴스가 될 수 있습니다. 또한 이러한 모든 셀의 식별자가 동일하기 때문에 버튼이있는 첫 번째 셀이 아래로 이동하는 상황이 발생할 수 있습니다. 그런 다음이 버튼을 제거해야합니다.UITableViewCell에서 UIButton 제거

나는 그런 방식으로 일을 해요 :

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

는 그러나, 응용 프로그램의 충돌이 발생합니다.

첫 번째 셀과 다른 셀에 다른 식별자를 사용하면이 문제를 해결할 수있을 것입니다. 아마도 더 나은 솔루션 일 것입니다. 그러나, 나는이 코드가 잘못되었거나 UITableViewCell의 하위 클래스에서 하위 뷰를 제거하는 동안 무엇을 알아야하는지 알고 싶습니다. @EDIT

:

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; 

추가 버튼 코드 : 여기 세포가 생성되는 코드입니다

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은 어떻게 생겼습니까? superview에서 단추를 제거했는데 단추를 놓을 것이라고 생각하지만 callBtn을 nil로 설정하지 마십시오. 둘 중 하나를 수행하고 수퍼 뷰에서 제거하기 전에 callBtn을 유지하거나 다시 제거 할 때 변수를 nil로 설정하고 다시 사용할 때 다시 작성해야합니다. 여기에 전체 코드를 게시하는 것이 더 좋습니다. 어딘가에 논리적 오류가 있습니다. BTW, ARC를 사용하지 않습니까? –

+0

행운이 있나요? – lnafziger

답변

2

귀하의 버튼에 의해 유지되고있다 그 'superview, 그리고 당신이보기에서 그것을 제거하면, 그것은 할당 해제됩니다. 그것을 유지하고 싶다면 removeFromSuperview를 호출하기 전에 그것을 유지할 필요가있다. 그렇지 않으면 할당을 해제 한 후에 다시 참조하지 않도록 nil로 설정한다.

따라서, 나는이에 코드를 변경합니다 :

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

을 실제로 (당신이 당신의 원본 코드에 무엇을하지 않은) 주변의 참조를 유지하려는 경우, 당신은이를 사용합니다 :

if(callBtn.superview != nil) { 
    [callBtn retain]; 
    [callBtn removeFromSuperview]; 
} 
관련 문제