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?
sectionHeaderHeightmi?
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?
sectionHeaderHeightmi?
Yanıtlar:
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.
numberOfSections.
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.
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.
UITableViewDelegateiçin selfbunu düşündüm çünkü tableView:viewForHeaderInSectionbir olduğunu UITableViewDataSourceyöntemi. Teşekkür ederim!
titleForHeaderiçsel bir boyuta sahip olarak elde edebilirsiniz. İç boyut, Yazı Tipi Ailesi ve boyutuna göre hesaplanır.
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.
tableView:viewForHeaderInSection:: "Bu yöntem yalnızca tableView:heightForHeaderInSection:uygulandığında doğru şekilde çalışır .".
titleForHeaderInSectionve viewForHeaderInSection? Tablo görünümü yalnızca ikisinden birini çağıracak (şu anda hangisinin öncelikli olduğunu unutuyorum).
viewForHeader ç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
Vermek estimatedSectionHeaderHeightve sectionHeaderHeightdeğer vermek sorunumu çözdü. Örneğin,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
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.
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;
}
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 datableView:heightForFooterInSection:uyan bir değer iade bir yükseklikte sonuçlarıtableView:titleForHeaderInSection:ya datableView:titleForFooterInSection:başlık, eğer sıfır değildir.
estimatedSectionHeaderHeightdeğere ayarlarsanız tableView:viewForHeaderInSectionçağrılır (satırlar için otomatik boyutların nasıl çalıştığına benzer şekilde)
İ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.
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
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
İş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)
}
}
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ı.
Benim durumumda
viewForHeaderInSection
çok uzakta bulunan ve bir üst sınıfa girme zahmetine girmeyen türetilmiş bir sınıfta uygulandı.
Aranmamasının nedeni viewForHeaderInSectioniki nedenden biridir:
Ya kendiniz ayarlamadınız UITableViewDelegateya da UITableViewDelegateyanlış ayarladınız .
Benim durumumda, uygulamadığım sebepti:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
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
}
heightForHeaderInSection:?