2012-12-06 4 views
2

다음 코드는 iOS 6에서 정상적으로 작동합니다. 그러나 iOS 5에서는 장치가 충돌하도록 무한 루프에 걸립니다. "self.footerView = ..."행이 실행되면 viewForFooterInSection을 다시 호출합니다. 따라서 무한 루프에서이를 트래핑합니다.viewForFooterInSection 무한 루프에서 잡힌

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section 
{ 
    if (!self.footerView) 
     self.footerView = [[UIView alloc] initWithFrame:[tableView rectForFooterInSection:section]]; 

    return self.footerView; 
} 

더 좋은 방법이 있나요? 이 기능은 iOS 6에서 작동하지만 5에서 작동하지 않는 이유는 무엇입니까?

감사합니다,

피터 rectForFooterInSection 뷰 프레임을 계산하기 위해 대리자 메서드 tableView:viewForFooterInSection:를 호출 가능성이 높다

답변

1

.

이것이 무한 루프가된다는 것은 나에게 (그리고 예상되는) 합리적인 것처럼 보입니다.

당신은 기본적으로 섹션 xfooterView 섹션 xfooterView, 당신은 반환하기로하는 바로 그 동일한 프레임과 UIView이라고 말하고있다. 여기서 재귀적인 문제를 볼 수 있습니까?

무한 루프 (아마도 바닥 글 프레임에 대한 일부 기본값에 의존)를 방지하는 구현 변경 사항이 분명히있었습니다. 위의 구현 방식은 틀렸습니다.

footerView을 독립적으로 정의하고 위임 방법으로 반환해야합니다.

1

이 문제가 발생했습니다. 바닥 글을 설정하는이 방법은 저의 바닥 글을 주기적으로 새로 고치기를 원하기 때문에 나에게 가장 적합합니다. 라벨에 핸들을 두는 것이 좋습니다. 재귀하는 경우에는 nil 만 반환하면 사과가 사각형을 알아낼 수 있습니다 (iOS 4.3에서 5.1에서도 마찬가지입니다).

static BOOL alreadyCheckingFooter = false; 
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section 
{ 
    if (!self.footerView) { 
     if (alreadyCheckingFooter) 
      return nil; 
     alreadyCheckingFooter = true; 
     self.footerView = [[UIView alloc] initWithFrame:[tableView rectForFooterInSection:section]]; 
     alreadyCheckingFooter = false; 
    } 

    return self.footerView; 
} 
관련 문제