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?
sectionHeaderHeight
mi?
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?
sectionHeaderHeight
mi?
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 ( viewForHeader
veya titleForHeader
) kullanmalısınız.
numberOfSections
.
titleForHeaderInSection:
ve viewForHeaderInSection:
ve ikincisi döndü görünümü bir alt sınıfıdır UITableViewHeaderFooterView
sonra onun textLabel.text
otomatik 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 UITableView
protokolları tableView:titleForHeaderInSection:
a, UITableViewDataSource
protokol yöntem tableView:viewForHeaderInSection
aittir UITableViewDelegate
.
Bunun anlamı:
Eğer yöntemleri uygulamak ama sadece kendinizi atarsanız
dataSource
için UITableView
, sizin
tableView:viewForHeaderInSection
uygulaması dikkate alınmayacaktır.
tableView:viewForHeaderInSection
daha yüksek bir önceliğe sahiptir. Her iki yöntemi de uygular ve kendinizi hem the dataSource
hem de delegate
for için UITableView
olarak 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:viewForHeaderInSection
doğ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.
UITableViewDelegate
için self
bunu düşündüm çünkü tableView:viewForHeaderInSection
bir olduğunu UITableViewDataSource
yöntemi. Teşekkür ederim!
titleForHeader
iç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 titleForHeader
ve 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 viewForHeader
olmayacak 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 .".
titleForHeaderInSection
ve 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. viewForHeader
viewForHeader
Vermek estimatedSectionHeaderHeight
ve sectionHeaderHeight
değ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.0f
için return 0.0f
de tableView:heightForHeaderInSection
, temsilci yöntemi tableView:viewForHeaderInSection
gerç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.
UITableViewAutomaticDimension
UITableViewHeaderFooterView
temsilci 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.
estimatedSectionHeaderHeight
değ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 viewForHeaderInSection
bu ş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 viewForHeaderInSection
iki nedenden biridir:
Ya kendiniz ayarlamadınız UITableViewDelegate
ya da UITableViewDelegate
yanlış 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:
?