V tabulce je nějaká sekce, která neobsahuje žádná data a chtěla by tuto sekci skrýt.
Jak to udělat?
Nelze „skrýt“ část jako takovou, ale můžete ji „odstranit“ z pohledu tabulky pomocí metody deleteSections:withRowAnimation:
. To jej odstraní z pohledu s volitelnou animací, aniž by to ovlivnilo data zálohování. (Měli byste je však stejně aktualizovat, aby se sekce znovu nezobrazovala.)
Více informací: Odkaz na třídu UITableView
Vlastně můžete sekci skrýt. Pokud chcete použít podobné chování jako aplikace vestavěných kontaktů, kde jsou oddíly skryty, ale stále jsou uvedeny v rejstříku vpravo, můžete provést následující akce:
Implementujte protokol UITableViewDataSource
:
Vraťte všechny názvy sekcí (i skryté) do metody sectionIndexTitlesForTableView
.
Pro každou prázdnou sekci vraťte nil
z metody titleForHeaderInSection
.
Pro každou prázdnou sekci se vrátí 0
pro metodu numberOfRowsInSection
.
Zjistil jsem, že to funguje lépe než mazání sekcí, protože uživatel má konzistentní indexovou navigaci.
Je pravda, že 0 není platná výška pro záhlaví a zápatí. Výšky jsou však hodnoty CGF. Pro výšku záhlaví sekcí a zápatí můžete zadat velmi malé číslo (použité 0,1).
Nějaký hack, ale funguje to.
Nesouhlasím s Timem. Máme způsob, jak přistupovat k libovolné sekci/řádku tabulky odkudkoliv v našem kódu a měnit její vlastnost .hidden (a všechny ostatní vlastnosti).
Obvykle to používám:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:2];
[self.SeymourCakesTableView cellForRowAtIndexPath:indexPath].hidden = YES;
Počet řádků v této sekci můžete nastavit na 0. Však ponechá znatelnou prázdnou oblast, ve které býval.
Můžete také vrátit počet záznamů, které obsahují data z metody numberofSectionsInTableView:
A použít switch(indexPath.section)
. na další přepínač, jako:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.section) {
case 0:
return <header cell>;
break;
case 1:
if(firstRecordHasData){
return <second cell>;
break;
}
case 2:
if(secondRecordHasData){
return <second cell>;
break;
}
case 3:
return <some other cell>;
break;
default:
return <a regular cell>;
break;
}
}
Chvíli jsem s tím zápasil, protože jsem musel vynechat sekce uprostřed seskupeného stolu. Pokusili jste se o nastavení výšek buněk, záhlaví a zápatí na 0.0, ale to nefungovalo. Nelze odstranit pouze některé části z důvodu volaných metod v závislosti na vybraném řádku. Tohle bude obrovský, pokud ... pokud, pokud bude vícenásobné volání podprogramů. Jsem rád, že jsem myslel na dobrou starou metodu přepínání, možná vám to také pomůže :-)
Pokud vrátíte 0 pro výšku sekce, Apple API ji bude ignorovat. Takže vraťte malou hodnotu větší než 0.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
if (section == 0) {
return 1;
}
return 44;
}
Také implementovat pohled pro záhlaví a vrátit nil pro sekci, kterou nechcete zobrazit.
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
if (section == 0 && !self.personaCells.count) {
return nil;
}
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 44)];
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 20, headerView.frame.size.width, 20)];
NSString *headerTitle = @"SAMPLE TITLE";
headerLabel.text = headerTitle;
[headerView addSubview:headerLabel];
return headerView;
}
Výšku jednotlivých sekcí můžete nastavit na 0. Také s hlavičkou sekce, pokud chcete. Zdroj dat by tam stále byl, jen by se nezobrazoval.
Řádky řádků
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0) {
if (_shouldHidden) {
return 0.0;
}
else {
return 55.0;
}
}
else {
return 55.0;
}
}
Pravděpodobně budete muset odstranit část samotnou z dat zálohování tabulky. Nemyslím si, že by vám něco skrylo sekci.
Pro případ statické tabulky, to znamená, že sekce tabulek a buňky jsou konfigurovány ve Storyboardu. Níže jsou mé strategie skrýt určité části v závislosti na podmínkách.
Krok 1 : implementovat dvě func
definované v UITableViewDelegate
- heightForRowAt
- heightForHeaderInSection
Zde jsou například kódy Swift:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
// if indexPath contains the specified section AND
// the condition for hiding this section is `true`
// return CGFloat(0)
// else
// return super.tableView(tableView, heightForRowAt: indexPath)
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
// similar logic to set header height
}
Krok dva : definování func pro nastavení buněk skrytých pro konkrétní sekci a volání z viewWillAppear:
private func setSectionVisible()
{
/*
if condition for visible is true
let index = IndexPath(row:..., section:...)
let cell = self.tableView.cellForRow(at: index)
cell.isHiden = true
*/
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setSectionVisible()
}
V případě, že potřebujete znovu načíst tabulku, budete možná muset znovu zavolat setSectionVisible()
.
Myslím, že tato strategie může fungovat pro dynamická data z DataSource. Tímto způsobem můžete ovládat, kdy se má určitá část zobrazit nebo skrýt.
Zkuste to takto: -
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
CGFloat headerHeight=10.f;
if (section==0)
{
headerHeight=0.01f;
}
else
{
headerHeight=50.0f;
}
return headerHeight;
}
Pro skrytí sekce, dokonce i uprostřed zobrazení tabulky, budete potřebovat všechny následující položky
#define DEBUG_SECTION 1
#if ! DEBUG_BUILD
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return CGFLOAT_MIN;
return [super tableView:tableView heightForHeaderInSection:section];
}
//------------------------------------------------------------------------------
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return CGFLOAT_MIN;
return [super tableView:tableView heightForFooterInSection:section];
}
//------------------------------------------------------------------------------
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return nil;
return [super tableView:tableView titleForHeaderInSection:section];
}
//------------------------------------------------------------------------------
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return nil;
return [super tableView:tableView titleForFooterInSection:section];
}
//------------------------------------------------------------------------------
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return 0;
return [super tableView:tableView numberOfRowsInSection:section];
}
//------------------------------------------------------------------------------
#endif // #if ! DEBUG_BUILD
pokud jste vynechali titleFor/headerFor ... dostanete nějaké prázdné řádky
pokud jste vynechali heightFor ... text záhlaví/zápatí se stále zobrazuje