2010-12-16 6 views
0

내 앱에서 아주 이상한 동작이 나타났습니다. 가장 단순한 시나리오에서 문제를 재현했습니다.행이 삭제되면 버튼이 맞춤 섹션 헤더보기에 추가됩니다.

NSMutableArray *data; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    data = [[NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil] retain]; 
} 

- (UIView *)tableView:(UITableView *)aTableView viewForHeaderInSection:(NSInteger)section { 
    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 32.0)]; 
    header.backgroundColor = [UIColor lightGrayColor]; 
    [header addSubview:self.button]; 
    return header; 
} 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) {  
     [data removeObjectAtIndex:indexPath.row]; 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop]; 
    } 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return data.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease]; 
    cell.textLabel.text = [data objectAtIndex:indexPath.row]; 
    return cell; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

행을 삭제할 때마다 문제가 재현됩니다. 내 머리글의 버튼이 사라집니다! 이것은 내가 사용하는 rowAnimation의 유형에 관계없이 발생합니다. 헤더가 스크롤되도록 테이블을 위로 스크롤하면; 헤더가 반환되면 버튼이 반환됩니다. 버튼은 xib 파일에 생성됩니다.

나는 두 가지 방법 중 하나에 해결할 수 있습니다 삭제 후있는 tableView의 데이터를 다시로드

  • ; 삭제 애니메이션이 먼저 완료되도록 지연 시키십시오.
  • interfaceBuilder 대신 viewForHeaderInSection에 버튼을 생성합니다.

    나는 여기서 무슨 일이 일어나고 있는지 알고 싶습니다. 버튼은 어디에 있습니까? 행을 삭제할 때 viewForHeaderInSection이 호출됨을 확인했습니다.

편집 내가 만들거나 버튼을 삭제할 때, 나는 특정 설정하고 ... 버튼을 대신 XIB에서의, viewForHeader에서 생성되도록 나는 그것을 변화 시도,하지만 다른 이상한 문제의 원인 제목과 같은 속성 및 테이블에있는 항목의 수에 따라 활성화됩니다. 표의 마지막 행을 삭제할 때 화면에서 버튼을 스크롤하고 다시 켜기 전까지는 텍스트로 업데이트 된 것을 볼 수 없습니다.

답변

0

위임 메서드 tableView:heightForHeaderInSection:을 구현 한 위치는 어디입니까? tableView:viewForHeaderInSection:이 올바르게 작동하는 데 필요합니다. 문서를 확인하십시오. Reference for UITableView delegate

나는 내가 행을 삭제할 때 viewForHeaderInSection가 호출되는 것을 확인했습니다.

버튼이 추가 된 특정 헤더에 대해 viewForHeaderInSection이 호출되었음을 확인 했습니까? 그런 다음 버튼을 추가 한 후

[header bringSubviewToFront:self.button]; 

을 추가하십시오.

+1

tableView : cellForRowAtIndexPath에서 테이블 셀을 재사용하지 않는 이유는 무엇입니까? –

+0

실제 코드에서 표 셀을 재사용하고 있습니다. 여기에 코드를 게시하기 위해 가능한 한 간결하게 작성하고 동일한 문제가있는 코드를 게시했습니다. xib 파일에 heightForHeader를 정의하고 있습니다. – GendoIkari

+0

내 편집/추가를 참조하십시오. –

1

버튼의 인스턴스가 하나뿐이기 때문에 테이블보기에서 새 머리글보기를 만들기로 결정하면 현재 부모에서 단추가 제거되고 새 머리글로 이동됩니다. 테이블에 하나의 섹션 만있는 경우에도 테이블 뷰는 내부적으로 이상한 일을하고 화면 밖에서 헤더 뷰를 다시 만들 수 있으므로 한 번에 하나의 섹션 만 사용할 수는 없습니다.

viewForHeaderInSection:에 단추를 만들고 다른 문제를 해결하십시오. viewForHeaderInSection의 버튼 속성 만 업데이트하는 대신 삭제 이벤트를 처리하여 행을 삭제하면 버튼도 업데이트됩니다.

+0

뭔가있는 것 같아요 ... 아마도 내가 조작하고있는 버튼이 내 헤더보기의 다른 인스턴스에 추가되고있을 것입니다. 하나는 표시되지 않습니다. 내 삭제 메서드에서 제목을 업데이 트 오전; viewForHeaderInSection에 단추를 만들 때뿐만 아니라. viewForHeaderInSection이 호출 될 때마다 새로운 버튼을 만들고 있습니다. 새 머리글이 새 단추에 표시되거나 이전 단추가 표시되어야하는 것처럼 보입니다 (새 머리글이 아직 표시되지 않기 때문에). 그러나 단추의 두 인스턴스 모두 해당 시점에서 올바른 제목을 가져야합니다. – GendoIkari

0

글쎄 나는 적어도 내 문제를 해결할 수 있었다. 나는 내가 만든에있는 뷰에 대해 iVar와 속성을 만들었고, 아직 하나도 없다면 새로운 뷰를 생성한다.그렇지 않으면 나는 이미 가지고있는 머리글을 반환합니다. 다음과 같은 내용 :

- (UIView *)tableView:(UITableView *)aTableView viewForHeaderInSection:(NSInteger)section { 
    if (!self.myHeader){ 
     UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 32.0)]; 
     header.backgroundColor = [UIColor lightGrayColor]; 
     [header addSubview:self.button]; 
     self.myHeader = header; 
     [header release]; 
    } 
    return self.myHeader; 
} 

이 방법이 효과적이지만 정확히 무슨 일이 벌어지고 있는지 이해하는 것은 매우 좋습니다. 내가 말할 수있는 한, viewForHeaderInSection은 시스템에 의해 호출되지만, 그 메소드에서 리턴 한 뷰의 인스턴스는 실제로 사용/표시되지 않습니다. 최소한 뷰를 다시 그리기 위해 무언가를 할 때까지는 ...

관련 문제