IT-Swarm.Net

Jak skrýt sekci v UITableView?

V tabulce je nějaká sekce, která neobsahuje žádná data a chtěla by tuto sekci skrýt.

Jak to udělat?

26
Teo Choong Ping

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

21
Tim

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.

52
TJez

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.

13
marcus

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;
5
Deepukjayan

Počet řádků v této sekci můžete nastavit na 0. Však ponechá znatelnou prázdnou oblast, ve které býval. 

2
Cocoanut

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 :-)

2
Maarten Wolzak

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;
    }
}
1
ariauakbar

Pravděpodobně budete muset odstranit část samotnou z dat zálohování tabulky. Nemyslím si, že by vám něco skrylo sekci.

1
Simon

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.

0
David.Chu.ca

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;
}
0
Hussain Shabbir

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 

0
Hofi