UITableView: viewForHeaderInSection: reloadData sırasında çağrılmaz:


127

Tablo görünümünü doğru temsilci ve veri kaynağı bağlantılarıyla kurdum .. reloadData yöntemi, hariç veri kaynağını ve temsilci yöntemlerini çağırır viewForHeaderInSection:.

Neden böyle?


30
Uygulandı mı heightForHeaderInSection:?
7usam

TableView'lar için bir değer belirlediniz sectionHeaderHeightmi?
Carter Medlin

Yanıtlar:


256

Kullanımı, tableView:viewForHeaderInSection:sizin de uygulamanızı gerektirir tableView:heightForHeaderInSection:. Bu, başlık için sıfır olmayan uygun bir yükseklik döndürmelidir. Ayrıca tableView:titleForHeaderInSection:,. Yalnızca birini veya diğerini ( viewForHeaderveya titleForHeader) kullanmalısınız.


3
Yöntemin imzasında bir yazım hatası olmadığından emin olun. Yanlış bir mektup aranmayacağı anlamına gelir. Davayı da kontrol edin. Ayrıca 0'dan döndüğünüzden emin olun numberOfSections.
rmaddy

her şey doğru ve doğru bir şekilde derleniyor .. anlamak istediğim sorun, yöntemin ne zaman çağrılacağıyla ilgili .. tableView: viewForHeaderInSection, tablo [ tableview reloadData]
inforeqd

@maddy OMG Teşekkürler, çok aptalca örneklerimi oluşturdum ama
dizime eklemedim

4
Kesinlikle ikisine de sahip olabilirsiniz. viewForHeaderInSection: titleForHeaderInSection'a göre önceliğe sahip olacak: Tek gereksinim, tablo görünümünüzde 0'dan farklı bir şeyle tahminiSectionHeaderHeight'ı ayarlamanızdır, aksi takdirde viewForHeaderInSection: asla çağrılmayacak
54'te

@ Romrom yorumuna ekleme: Her iki uygulamaya varsa titleForHeaderInSection:ve viewForHeaderInSection:ve ikincisi döndü görünümü bir alt sınıfıdır UITableViewHeaderFooterViewsonra onun textLabel.textotomatik tüm-kapaklar sürümü belirlenir titleForHeaderInSection:dize. Bu davranışı önlemek için titleForHeaderInSection:, devralınan etiket yerine özel bir etiket uygulamayın veya kullanmayın textLabel.
Ortwin Gentz

40

Hile, bu iki yöntem, farklı ait olduğunu UITableViewprotokolları tableView:titleForHeaderInSection:a, UITableViewDataSourceprotokol yöntem tableView:viewForHeaderInSectionaittir UITableViewDelegate.

Bunun anlamı:

  • Eğer yöntemleri uygulamak ama sadece kendinizi atarsanız dataSourceiçin UITableView, sizin tableView:viewForHeaderInSectionuygulaması dikkate alınmayacaktır.

  • tableView:viewForHeaderInSectiondaha yüksek bir önceliğe sahiptir. Her iki yöntemi de uygular ve kendinizi hem the dataSourcehem de delegatefor için UITableViewolarak atarsanız, bölüm başlıklarının görünümlerini döndürürsünüz, ancak sizin yönteminiz tableView:titleForHeaderInSection:yok sayılır.

Ayrıca kaldırmayı da denedim tableView:heightForHeaderInSection:; iyi çalıştı ve yukarıdaki prosedürleri etkilemedi. Ancak belgeler, tableView:viewForHeaderInSectiondoğru çalışması için gerekli olduğunu söylüyor ; bu yüzden güvenli olmak için bunu da uygulamak akıllıca olacaktır.


6
Günümü gün ettin!!! Atamak Unuttum UITableViewDelegateiçin selfbunu düşündüm çünkü tableView:viewForHeaderInSectionbir olduğunu UITableViewDataSourceyöntemi. Teşekkür ederim!
denis631

1
"tableView: viewForHeaderInSection" hayati değildir. Hayati olan şey, bir şekilde bir yüksekliğe geri dönmen. Bunu, 1. tahmin veya 2. sabit kodlanmış bir değer veya 3. a titleForHeaderiçsel bir boyuta sahip olarak elde edebilirsiniz. İç boyut, Yazı Tipi Ailesi ve boyutuna göre hesaplanır.
Honey

28

gerçekte,: @rmaddy iki defa kuralı, yanlış beyan etmiştir tableView:viewForHeaderInSection:yok değil aynı zamanda uygulamak gerektirir tableView:heightForHeaderInSection:ve ayrıca her iki çağrı herhangi bir sorun oluşturmaz titleForHeaderve viewForHeader. Sadece kayıt için kuralı doğru şekilde ifade edeceğim:

Kural basitçe viewForHeader, başlığa bir şekilde bir yükseklik vermedikçe çağrılmayacaktır. Bunu üç yolun herhangi bir kombinasyonuyla yapabilirsiniz:

  • Uygulayın tableView:heightForHeaderInSection:.

  • Masayı ayarlayın sectionHeaderHeight.

  • Çağrı titleForHeader(bu, başka türlü yoksa başlığa bir şekilde varsayılan yükseklik verir).

Bunlardan hiçbirini yapmazsanız, başlıklarınız viewForHeaderolmayacak ve çağrılmayacaksınız. Bunun nedeni, yükseklik olmadan çalışma zamanının görünümü nasıl yeniden boyutlandıracağını bilemeyeceği için bir tane istemek zahmetine girmez.


Dokümanlardan tableView:viewForHeaderInSection:: "Bu yöntem yalnızca tableView:heightForHeaderInSection:uygulandığında doğru şekilde çalışır .".
rmaddy

1
İnce. Doktorlar ne diyor, diyorlar. Şimdi deney yapın. Gerçekler belirttiğim gibi.
mat

Ve nasıl sahip hem edebilir titleForHeaderInSectionve viewForHeaderInSection? Tablo görünümü yalnızca ikisinden birini çağıracak (şu anda hangisinin öncelikli olduğunu unutuyorum).
rmaddy

1
Aslında bulmacanın bir parçası daha var, bu da bazen bu üç yükseklik atama yönteminin hiçbiri olmadanviewForHeader çağrılıyor . Bu oldu , benim arandığım ve başlıkların gayet güzel göründüğü bir güne kadar, benim açımdan hiçbir değişiklik olmadan, onlar olmadı . İşte o zaman minimum gereksinimlerin ne olduğunu keşfetmek için denemeye başladım . Ve şimdi biliyorum. Ve şimdi sen de öyle. viewForHeaderviewForHeader
mat

2
@texas Hayır, xamarin yapmıyorum. Cocoa çerçevelerinin üstüne başka bir dolaylama düzeyi eklemek, kafamı patlatırdı. :)
mat

20

Vermek estimatedSectionHeaderHeightve sectionHeaderHeightdeğer vermek sorunumu çözdü. Örneğin, self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension


Sorunum Swift 3.1'e yükselttikten sonra başladı. Bu çözüm onu ​​düzeltti.
zevij

@pbuchheit Apple Docs, iOS 7.0+ sürümünde mevcut olduğunu söylüyor, lütfen buraya bir göz atın, developer.apple.com/documentation/uikit/uitableview/…
Sharukh Mastan

@Sharukh Mastan Doğru görünüyorsun. Nedense o mülkü kullanmayı denediğimde bir uyarı alıyordum, ancak temiz bir yapı yaptıktan sonra kayboldu.
pbuchheit

7

Rmaddy'nin cevabından çıkarken, Üstbilgi görünümünü gizlemeye çalışıyordum ve "tableView: heightForHeaderInSection" ve 0 yükseklik Görünümü için 0.0f döndürüyordum tableView:viewForHeaderInSection.

Değişen sonra return 1.0fiçin return 0.0fde tableView:heightForHeaderInSection, temsilci yöntemi tableView:viewForHeaderInSectiongerçekten olarak adlandırıldı.

İstediğim efektin "tableView: heightForHeaderInSection" kullanmak zorunda kalmadan çalıştığı ortaya çıktı; ancak bu, "tableView: heightForHeaderInSection" delege yöntemi çağrılırken sorun yaşayan başkaları için yararlı olabilir.


5

tableView:heightForHeaderInSection:Başlığın yüksekliğini> 0 uygulamalı ve ayarlamalısınız.

Bu temsilci yöntemi, viewForHeaderInSection:yöntemle birlikte gider .

Umarım bu yardımcı olur.

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

Cevabınızın gerçekten işe yarayıp yaramadığını test ettiniz mi? Dikkatlice okursanız, başlangıçta viewForHeaderInSection'ın çağrıldığı belirtilir. Sadece masa yeniden yüklendiğinde çağrılmaz!
Karlis

5

Sizin uygulanması halinde belirterek It değerinde kısaca tableView:heightForHeaderInSection:dönüşleri UITableViewAutomaticDimension, daha sonra tableView:viewForHeaderInSection:denilen edilmeyecektir.

UITableViewAutomaticDimensionUITableViewHeaderFooterViewtemsilci yöntemiyle doldurulan bir standardın kullanılacağını varsayar tableView:titleForHeaderInSection:.

Şuradaki yorumlardan UITableView.h:

Bu değeri dönen tableView:heightForHeaderInSection:ya da tableView:heightForFooterInSection:uyan bir değer iade bir yükseklikte sonuçları tableView:titleForHeaderInSection:ya da tableView:titleForFooterInSection:başlık, eğer sıfır değildir.


1
bir estimatedSectionHeaderHeightdeğere ayarlarsanız tableView:viewForHeaderInSectionçağrılır (satırlar için otomatik boyutların nasıl çalıştığına benzer şekilde)
GreatWiz

İlginç, teşekkürler. 7.1'e dönüldüğünde, tahmini yüksekliğin bu inceliği hücreler için önemliydi , bu nedenle başlıklar için de geçerli olabilirdi - ancak şu anda çok da alakalı değil!
Benjohn

3

İOS 7.1 için gösterilmeyen başlıklarla ilgili bir sorun yaşadım , ancak açıkça 8.1 ve 8.4 ile test ettiğim sonraki sürümlerde sorunsuz çalışıyor.

Tam olarak aynı kod için, 7.1 bölüm başlığı temsilci yöntemlerinden hiçbirini çağırmıyordu: tableView:heightForHeaderInSection:ve tableView:viewForHeaderInSection:.

Deneyimden sonra, bu satırı yaptığım başlıklardan kaldırmanınviewDidLoad 7.1 için yeniden göründüğünü ve test ettiğim diğer sürümleri etkilemediğini buldum:

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

... yani, 7.1 için orada bir tür çatışma var gibi görünüyor, en azından.


3

Aynı sorun benimle oluştu ama kullanıyordum olarak otomatik yükseklik hesaplama gelen Xcode 9 yukarıda belirtildiği gibi, herhangi bir açık yükseklik değerini veremez. Bazı deneylerden sonra çözüm buldum , bu yöntemi şu şekilde geçersiz kılmalıyız:

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

Her iki seçeneği de kontrol etmeme rağmen

  1. Otomatik Yükseklik Hesabı
  2. Otomatik Tahmini Yükseklik Hesabı

dan film şeridinde elma diyor ama hala bu garip hata var olarak.

Lütfen Dikkat : Bu hata yalnızca gösterildi IOS-10 versiyonunda olmamasına IOS-11 sürümü. Belki de xCode'dan gelen bir hatadır. Teşekkürler


0

İşte bulduğum şey ( Swift 4 ) ( başka bir soruya yapılan bu yorum sayesinde )

TitleForHeaderInSection veya viewForHeaderInSection kullansam da - tablo görünümü kaydırıldığında ve yeni hücreler yüklenirken çağrılmadıkları için değildi, ancak headerView'ın textLabel'i için yaptığım yazı tipi seçimleri yalnızca başlangıçta yükte görünür olanlarda görünüyordu ve tablo kaydırıldığında değil.

Düzeltme willDisplayHeaderView oldu:

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

Benim durumumda UITableviewCell, hücreyi viewForHeaderInSectionbu şekilde kullanarak ve döndürerek başlık görünümü oluşturdum

return cell

bunu değiştirdi

return cell.contentView 

Benim için çalıştı.


0

Benim durumumda

viewForHeaderInSection

çok uzakta bulunan ve bir üst sınıfa girme zahmetine girmeyen türetilmiş bir sınıfta uygulandı.


0

Aranmamasının nedeni viewForHeaderInSectioniki nedenden biridir:

Ya kendiniz ayarlamadınız UITableViewDelegateya da UITableViewDelegateyanlış ayarladınız .


0

Benim durumumda, uygulamadığım sebepti:

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

-1

Bazen ayarını tableview.delegateveya datasource = niliçinde viewWillAppear:veya viewDidAppear:yöntemlerin bu soruna neden olabilir. Bunu yapmadığınızdan emin olun ...


-1

Bir Swift 2 projesinden aşağıdaki iki yöntemi kesip Swift 3 projeme yapıştırdım, ancak Swift 3'te bu yöntemlerin ilk parametre adından önce "-" olması gerekir.

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.