2015-02-05 3 views
0

사용자 정의 UITableViewCell이 있습니다. 셀이 선택되면 UILabel이 추가됩니다. 내가 그렇게처럼 혼란스러워하지 않도록하기위한 prepareForReuse를 사용했다 : 내가 충분히 아래로 스크롤 할 때선택한 셀에 대해 prepareForReuse 사용 안 함

- (void)prepareForReuse { 
    NSArray *viewsToRemove = [self.view subviews]; 
    for (UILablel *label in viewsToRemove) { 
     [label removeFromSuperview]; 
    } 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CategorieCell *customCell = [tableView dequeueReusableCellWithIdentifier:@"cellID" forIndexPath:indexPath]; 
    return customCell; 
} 

문제는 레이블이보기를 벗어 났음, 그리고 내가 위로 다시 스크롤 레이블이 아니다 더 이상. 그 이유는 세포가 재사용 될 때 모든 라벨을 제거했기 때문입니다.

그래서 선택된 행에 대해 prepareForReuse (또는 메소드의 코드 만)을 비활성화하는 방법이 있습니까?

+0

이해 못하셨습니까? 명확하게 설명해주십시오. – Saif

+0

어느 부분을 이해하지 못합니까? –

+0

Cell For Row 메서드를 게시 할 수 있습니까? – Saif

답변

0

생각해에서 모델과 현재 위치에 따라 셀을 구성 할 수있는 제안 곳입니다 셀을 다른 컨테이너 (레이블, 이미지, 버튼 등)를 보유하기 위해 재사용하는 바보 같은 컨테이너로 만듭니다.

cellForRowAtIndexPath에서 셀을 채 웁니다.

prepareForReuse에서 비워두면 다시 채워서 다시 사용할 수 있습니다.

두 가지 작업을 혼동하지 마십시오.

셀을 채울 때 다른 셀이 아닌 다른 곳에 저장 한 데이터로 셀을 채워야합니다. 셀을 채울 때 도움이되는 indexPathsOfSelectedCells를 사용하는 경우 문제가 발생할 것입니다. 이러지 마.

일반적으로 개체 배열이 있으며 각 개체는 셀에 해당합니다. 배열에있는 객체만큼 테이블에 많은 셀이 있습니다. 배열의 객체를 viewDidLoad에서 초기화하거나 이전 뷰 컨트롤러에서 객체를 전달할 수 있습니다.

이 과정은 복잡하지 않아도됩니다. 대부분의 셀은 단지 몇 비트의 데이터 만 표시하므로 객체 (모델이라고도 함)에는이 데이터를 보유 할 속성이 많이있을 필요가 없습니다.

사용자가 셀을 선택하면 해당 객체에 "selected"속성을 설정하여이를 나타냅니다. 셀이 화면 밖으로 스크롤되어 다시 사용되는 경우에도이 값은 개체 주위에 유지됩니다. 좋습니다.

사용자가 셀로 다시 스크롤하면 해당 객체의 데이터로 셀을 채 웁니다. 그 객체는 "selected"속성 집합을 가지고 있기 때문에,이 경우에 원하는 레이블을 추가하여 셀을 채 웁니다.또는 설정되지 않은 경우 레이블을 추가하지 마십시오.

prepareForReuse에서 항상 레이블을 제거하여 셀을 빈 상태 (리필 할 준비가)로 만듭니다.

1

스크롤 한 셀은 다시 사용되며 주변에는 셀이 없습니다. removeFromSuperview 로직을 피할지라도, 그 셀은 다른 인덱스 경로에서 다시 나타납니다. 원하는 위치가 아닐 수도 있습니다.

조건부로 셀을 구성하는 방법은 cellForRowAtIndexPath에 있습니다. indexPath가 테이블 뷰의 indexPathsOfSelectedCells에 속하는지 물어볼 수 있습니다. 그렇다면 여분의 레이블로 구성하거나 그렇지 않으면 구성하십시오.

혼란을 줄이는 한 가지 방법은 선택 상태에 따라 무조건 셀에 레이블을 유지하고 알파를 0 또는 1로 설정하는 것입니다.

큰 점은
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    // if you know the table has singular selection 
    NSIndexPath *selectedIndexPath = [tableView indexPathForSelectedRow]; 
    BOOL rowIsSelected = [indexPath isEqual:selectedIndexPath]; 

    // OR, for multiple select... 
    NSArray *selection = [tableView indexPathsForSelectedRows]; 
    BOOL rowIsSelected = [selection containsObject:indexPath]; 

    // now either conditionally create/destroy or show/hide the subviews 
    // that appear on selection (I prefer show/hide for simpler cells)... 

    [cell configAsSelected:rowIsSelected]; // have the custom cell do it 

    // in that method, or here, if you're less OO-inclined... 
    cell.subviewThatAppearsOnSelected.alpha = (rowIsSelected)? 1.0 : 0.0; 

예를 들어

은이 안정적으로 테이블 테이블의

+0

이라는 질문이 업데이트되었습니다. if (if indexPath == [tableview indexPathForSelectedRow] {...})가 작동하지 않습니다. –

+0

== 동일한 객체인지 테스트합니다. 더 일반적인 tat는 같은 행을 참조하는 경우입니다 : isEqual : – danh