UITableView : viewForHeaderInSection : reloadData 중에 호출되지 않습니다.


127

올바른 대리자 및 데이터 소스 연결을 사용하여 tableview를 설정했습니다. reloadData 메소드는 데이터 소스 및 대리자 메소드를 제외하고 호출합니다. viewForHeaderInSection: .

왜 이렇게이다?


30
heightForHeaderInSection:구현?
7usam

TableView의 값을 설정 했습니까 sectionHeaderHeight?
카터 메 드린

답변:


256

를 사용 tableView:viewForHeaderInSection:하려면 구현해야합니다 tableView:heightForHeaderInSection:. 헤더에 적절한 0이 아닌 높이를 반환해야합니다. 또한 구현하지 않아야합니다 tableView:titleForHeaderInSection:. 둘 중 하나만 사용해야합니다 ( viewForHeader또는 titleForHeader).


3
메소드의 서명에 오타가 없는지 확인하십시오. 하나의 잘못된 문자는 호출되지 않음을 의미합니다. 케이스도 확인하십시오. 또한에서 0을 반환하는지 확인하십시오 numberOfSections.
rmaddy

모든 것이 정확하고 올바르게 컴파일됩니다. 내가 이해하고 싶었던 문제는 메소드가 호출되는 시점의 타이밍에 관한 것입니다. tableview reloadData]
inforeqd

@maddy OMG 감사합니다. 너무 어리석어 서 인스턴스를 만들었지 만 배열에 추가하지 않았습니다.
Happiehappie

4
둘 다 가질 수 있습니다. viewForHeaderInSection : titleForHeaderInSection보다 우선합니다. 유일한 요구 사항은 테이블 뷰에서 추정 된 SectionHeaderHeight를 0이 아닌 다른 값으로 설정해야한다는 것입니다. 그렇지 않으면 viewForHeaderInSection :이 호출되지 않습니다.
romrom

@ romrom의 코멘트에 추가 : 당신이 모두 구현 한 경우 titleForHeaderInSection:viewForHeaderInSection:후자에서 반환 된보기의 하위 클래스 UITableViewHeaderFooterView다음의가 textLabel.text자동으로의 모든 대문자 버전으로 설정되어있는 titleForHeaderInSection:문자열입니다. 이 동작을 방지하려면 titleForHeaderInSection:inherited 대신 사용자 정의 레이블을 구현 하거나 사용 하지 마십시오 textLabel.
Ortwin Gentz

40

트릭은 두 가지 방법에 속해 있다는 것이다 UITableView프로토콜 : tableView:titleForHeaderInSection:A는 UITableViewDataSource프로토콜있어서, 여기서이 tableView:viewForHeaderInSection속하는UITableViewDelegate .

그것의 의미는:

  • 당신이 메소드를 구현하지만, 단지 자신을 할당하면 dataSource에 대한 UITableView당신의 tableView:viewForHeaderInSection구현은 무시됩니다.

  • tableView:viewForHeaderInSection우선 순위가 더 높습니다. 당신이 방법 모두를 구현하고 모두 자신을 할당하는 경우 dataSourcedelegate에 대한 UITableView, 당신은 섹션 헤더의 뷰를 반환하지만이 tableView:titleForHeaderInSection:무시됩니다.

나는 또한 제거를 시도했다 tableView:heightForHeaderInSection:; 그것은 잘 작동했으며 위의 절차에 영향을 미치지 않는 것 같습니다. 그러나 문서는 tableView:viewForHeaderInSection올바르게 작동 하는 데 필요하다고 말합니다 . 안전을 위해서도 이것을 구현하는 것이 현명합니다.


6
당신은 내 하루를했다! 할당 잊으 UITableViewDelegateself내가 그 생각 때문에, tableView:viewForHeaderInSectionA는 UITableViewDataSource방법. 감사합니다!
denis631

1
"tableView : viewForHeaderInSection"은 중요하지 않습니다. 중요한 것은 어떻게 든 높이를 반환하는 것입니다. 1. 추정 또는 2. 하드 코딩 된 값 또는 3. titleForHeader크기가 고유 한 크기 를 통해이를 달성 할 수 있습니다. 내장 크기는 글꼴 모음 및 크기를 기준으로 계산됩니다.
Honey

28

현실에서 : @rmaddy 두 번 규칙을 허위했다 tableView:viewForHeaderInSection:않습니다 하지 당신은 또한 구현하는 것이 필요 tableView:heightForHeaderInSection:하고, 또한 모두 전화를 완벽하게 괜찮 titleForHeaderviewForHeader. 나는 기록에 대해서만 규칙을 올바르게 진술 할 것입니다.

규칙은 단순히 viewForHeader헤더에 높이를 지정하지 않으면 호출되지 않습니다. 세 가지 방법을 조합하여이 작업을 수행 할 수 있습니다.

  • 구현 tableView:heightForHeaderInSection:.

  • 테이블을 설정하십시오 sectionHeaderHeight.

  • 호출하십시오 titleForHeader(그렇지 않으면 헤더에 기본 높이가없는 경우 기본 높이가 제공됩니다).

이러한 작업을 수행하지 않으면 헤더 viewForHeader가 없으며 호출되지 않습니다. 높이가 없으면 런타임에서 뷰의 크기를 조정하는 방법을 알지 못하므로 요청하지 않아도되기 때문입니다.


문서에서 tableView:viewForHeaderInSection:: "이 방법 tableView:heightForHeaderInSection:은 구현 된 경우에만 올바르게 작동합니다 ."
rmaddy

1
좋아. 문서가 말하는 것, 그들은 말합니다. 이제 실험 해보십시오. 사실은 내가 말한대로입니다.
matt

어떻게 당신은 모두 수 titleForHeaderInSectionviewForHeaderInSection? 테이블보기는 두 가지 중 하나만 호출합니다 (현재 우선하는 것을 잊어 버립니다).
rmaddy

1
실제로 퍼즐 조각이 하나 더 있는데, 때로는 높이를 지정하는 세 가지 방법 중 하나 없이viewForHeader 호출 됩니다 . 나는 이것이 일어 viewForHeader났는데 , 내 부름과 머리글은 언젠가는 아무런 변화도 없었지만 잘 보이지 않았다 . 그때 나는 최소한의 요구 사항이 무엇인지 알아 내기 위해 실험을 시작했습니다 viewForHeader. 그리고 지금은 알고 있습니다. 그리고 이제 당신도 그렇습니다.
matt

2
@texas 아니오, 나는 xamarin을하지 않습니다. Cocoa 프레임 워크 위에 다른 수준의 간접 지시를 추가하면 머리가 터질 것입니다. :)
matt

20

기부 estimatedSectionHeaderHeightsectionHeaderHeight가치관으로 내 문제가 해결되었습니다. 예를 들어 self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension


Swift 3.1로 업그레이드 한 후에 문제가 시작되었습니다. 이 솔루션은 그것을 고쳤습니다.
zevij

@pbuchheit Apple Docs는 iOS 7.0 이상에서 사용할 수 있다고 말합니다. developer.apple.com/documentation/uikit/uitableview/…
Sharukh Mastan

@Sharukh Mastan 당신이 올바른 것 같습니다. 어떤 이유로 나는 그 속성을 사용하려고 할 때 경고를 받았지만 깨끗한 빌드를 한 후에 사라졌습니다.
pbuchheit

7

rmaddy의 대답에서 헤더보기를 숨기려고하고 "tableView : heightForHeaderInSection"에 대해 0.0f를 반환하고 높이를 0으로 설정했습니다. tableView:viewForHeaderInSection .

변경 후에서 return 1.0freturn 0.0f에서 tableView:heightForHeaderInSection대리인 방법tableView:viewForHeaderInSection 참으로 불렸다.

"tableView : heightForHeaderInSection"을 사용하지 않고도 원하는 효과를 얻을 수 있습니다. 그러나 이것은 "tableView : heightForHeaderInSection"델리게이트 메소드 호출에 문제가있는 다른 사용자에게 유용 할 수 있습니다.


5

tableView:heightForHeaderInSection:헤더의 높이를> 0으로 구현 하고 설정 해야합니다 .

이 델리게이트 메소드는 메소드와 함께 진행됩니다 viewForHeaderInSection:.

이게 도움이 되길 바란다.

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
         return 40;
}

답이 실제로 효과가 있는지 테스트 했습니까? 주의 깊게 읽으면 처음에는 viewForHeaderInSection이 호출된다고 명시되어 있습니다. 테이블을 다시로드 할 때만 호출되지 않습니다!
카를리스

5

tableView:heightForHeaderInSection:returns 구현이 있다면 UITableViewAutomaticDimension,tableView:viewForHeaderInSection: 호출되지 않습니다.

UITableViewAutomaticDimensionUITableViewHeaderFooterViewdelegate 메소드로 채워진 표준 이 사용 된다고 가정합니다 tableView:titleForHeaderInSection:.

의 의견에서 UITableView.h:

이에서 값 반환 tableView:heightForHeaderInSection:또는 tableView:heightForFooterInSection:맞는 값에서 반환하는 높이 결과 tableView:titleForHeaderInSection:또는 tableView:titleForFooterInSection:제목 경우 것은 전무 없습니다.


1
estimatedSectionHeaderHeight어떤 값으로 설정 하면 tableView:viewForHeaderInSection(행의 자동 치수 작동 방식과 유사하게) 호출됩니다.
GreatWiz

재미 있네요 7.1로 돌아가서이 추정 된 높이의 미묘함은 셀에 중요 했기 때문에 헤더의 경우도 마찬가지 였지만 지금은 그다지 관련이 없습니다!
Benjohn

3

방금 iOS 7.1 용 헤더가 표시되지 않는 문제가 있었지만 8.1 및 8.4로 명시 적으로 테스트 한 이후 릴리스에서 제대로 작동합니다.

동일한 코드의 경우, 7.1했다 하지 포함하여 모든의 섹션 헤더 대리자 메서드 중 하나를 호출 : tableView:heightForHeaderInSection:tableView:viewForHeaderInSection: .

실험 후, 만든 헤더 에서이 줄 을 제거 하면 viewDidLoad7.1로 다시 나타나고 테스트 한 다른 버전에는 영향을 미치지 않습니다.

// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;

… 따라서 적어도 7.1에 대해서는 어떤 종류의 갈등이있는 것 같습니다.


3

나에게도 같은 문제가 발생했지만 xCode 9 에서 자동 높이 계산 을 사용 하면서 위에서 언급 한 것처럼 명시적인 높이 값을 제공 할 수 없습니다. 몇 가지 실험 후에 솔루션을 얻었 으므로이 방법을 재정의해야합니다.

-(CGFloat)tableView:(UITableView *)tableView 
         estimatedHeightForHeaderInSection:(NSInteger)section
{
      return 44.0f;
}

두 옵션을 모두 확인 했지만

  1. 자동 높이 계산
  2. 자동 추정 높이 계산

애플이 말한 것처럼 스토리 보드 에서 여전히 이상한 오류가 발생합니다.

참고 :이 오류는 IOS-11 버전이 아닌 IOS-10 버전 에서만 나타납니다 . 아마도 xCode의 버그 일 것입니다. 감사


0

여기 내가 찾은 것 ( Swift 4 ) ( 다른 질문에 대한 이 의견 덕분에 )

titleForHeaderInSection을 사용하든 viewForHeaderInSection을 사용하든 테이블 뷰를 스크롤하고 새 셀을로드 할 때 호출되지 않았지만 headerView의 textLabel에 대해 선택한 글꼴은로드시 처음 표시 된 항목에만 나타납니다. , 테이블이 스크롤되지 않았습니다.

수정 사항은 willDisplayHeaderView입니다.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let header = view as? UITableViewHeaderFooterView {
        header.textLabel?.font = UIFont(name: yourFont, size: 42)
    }
}

0

내 경우에는 다음 과 같이 UITableviewCell셀을 사용 하고 반환하는 헤더보기를 만들었습니다.viewForHeaderInSection

return cell

이것을 이것을

return cell.contentView 

나를 위해 일했다.


0

나의 경우에는

viewForHeaderInSection

데이지를 슈퍼 클래스로 귀찮게하지 않는 멀리 떨어진 파생 클래스에서 구현되었습니다.


0

이유 viewForHeaderInSection라는되지 않는 두 가지 이유 중 하나입니다 :

을 설정하지 않았 UITableViewDelegate거나 UITableViewDelegate잘못 설정했습니다 .


0

제 경우에는 구현하지 않은 원인이었습니다.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat

-1

때때로 tableview.delegate또는 설정 datasource = nil에서 viewWillAppear:또는이 viewDidAppear:방법으로이 문제가 발생할 수 있습니다. 이 작업을 수행하지 마십시오 ...


-1

Swift 2 프로젝트에서 다음 두 가지 메소드를 Swift 3 프로젝트로 잘라내어 붙여 넣었습니다. Swift 3에서는 이러한 메소드가 첫 번째 매개 변수 이름 앞에 "-"가 있어야하기 때문에 호출되지 않았습니다.

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 44.0
}

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: B2BTrolleyHeaderFooterView.reuseIdentifier) as! B2BTrolleyHeaderFooterView        
    return headerView
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.