UITableView, Не Уважая heightForHeaderInSection/heightForFooterInSection?

Я рекомендую подходить к нему по-другому, отслеживая самое последнее значение «Имя» в каждой точке. fill() из пакета tidyr полезен для этого.

library(dplyr)
library(tidyr)

originalDF %>%
  mutate(Name = ifelse(Field == "Name", as.character(Value), NA)) %>%
  fill(Name) %>%
  filter(Field != "Name")

Вывод:

   Index  Field Value Name
1      2 Weight   115 Sara
2      3    Age    17 Sara
3      5 Weight   158  Bob
4      6    Age    22  Bob
5      7 Height    72  Bob
6      9 Weight   210  Irv
7     10    Age    42  Irv
8     11 Height    68  Irv
9     13    Age   155 Fred
10    14 Height    65 Fred

Однако, если вы действительно хотите использовать подход fuzzyjoin, вы можете добиться этого с помощью group_by() и slice() в своем результате, где вы возьмите последнюю строку для каждого значения Index.x.

fuzzy_left_join(detailsDF, namesDF, by = "Index", match_fun = list(`>`)) %>%
  group_by(Index.x) %>%
  slice(n()) %>%
  ungroup()

Вывод:

# A tibble: 10 x 6
   Index.x Field.x Value.x Index.y Field.y Value.y
     <int> <fct>   <fct>     <int> <fct>   <fct>  
 1       2 Weight  115           1 Name    Sara   
 2       3 Age     17            1 Name    Sara   
 3       5 Weight  158           4 Name    Bob    
 4       6 Age     22            4 Name    Bob    
 5       7 Height  72            4 Name    Bob    
 6       9 Weight  210           8 Name    Irv    
 7      10 Age     42            8 Name    Irv    
 8      11 Height  68            8 Name    Irv    
 9      13 Age     155          12 Name    Fred   
10      14 Height  65           12 Name    Fred   
23
задан Glorfindel 20 April 2019 в 01:48
поделиться

5 ответов

В «сгруппированном» UITableView на iPhone он по-прежнему будет отображать минимальную высоту для верхнего и нижнего колонтитула, фактически игнорируя ваш код, чтобы установить его на ноль. Он не связан с XIB по умолчанию.

Это связано с тем, что заголовок или нижний колонтитул раздела нулевой высоты выглядели бы очень странно. Поэтому Apple постановила, что высота заголовка не может быть установлена ​​на 0. И поэтому несколько «пустых» разделов будут отображаться странно, как показано на вашем скриншоте.

Боюсь, это все потому, что вы ошиблись при очистке заголовка. размер при отсутствии строк данных; вместо этого вы не должны вызывать какие-либо методы для пустых разделов . Это плохой метод, потому что, по сути, iPhone должен вызывать больше методов, чем нужно, а также вы визуализируете больше заголовков, чем хотите (обычно - иногда люди хотят оставить там пустые заголовки, например, для перетаскивания).

Так, например, давайте представим, что у вас есть несколько разделов, но только некоторые из них содержат более одной строки (возможно, в зависимости от настроек / фильтров пользователя).

неправильный способ его реализации:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return totalNumberOfPossibleSections;
}

и затем для каждого раздела у вас нет результата для:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  if (![section hasRow]) return 0;
}

и

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
  if (![section hasRow]) return 0.0f;
}

правильный способ его реализации is:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}

и тогда в каждом разделе будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...

Надеюсь, это поможет!

например, для перетаскивания).

Итак, например, давайте представим, что у вас есть несколько разделов, но только некоторые из них содержат более одной строки (возможно, на основе пользовательских настроек / фильтров).

неправильный способ его реализации:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return totalNumberOfPossibleSections;
}

и затем для каждого раздела у вас нет результата для:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  if (![section hasRow]) return 0;
}

и

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
  if (![section hasRow]) return 0.0f;
}

правильный способ его реализации is:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}

и тогда в каждом разделе будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...

Надеюсь, это поможет!

например, для перетаскивания).

Итак, например, давайте представим, что у вас есть несколько разделов, но только некоторые из них содержат более одной строки (возможно, на основе пользовательских настроек / фильтров).

неправильный способ реализации:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return totalNumberOfPossibleSections;
}

, а затем для каждого раздела у вас нет результата для:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  if (![section hasRow]) return 0;
}

и

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
  if (![section hasRow]) return 0.0f;
}

правильный способ реализации is:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}

и тогда в каждом разделе будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...

Надеюсь, это поможет!

но только некоторые из них содержат более одной строки (возможно, в зависимости от настроек / фильтров пользователя).

неправильный способ его реализации:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return totalNumberOfPossibleSections;
}

и затем для каждого раздела у вас нет результата для:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  if (![section hasRow]) return 0;
}

и

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
  if (![section hasRow]) return 0.0f;
}

правильный способ его реализации is:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}

и тогда в каждом разделе будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...

Надеюсь, это поможет!

но только некоторые из них содержат более одной строки (возможно, в зависимости от настроек / фильтров пользователя).

неправильный способ реализации:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return totalNumberOfPossibleSections;
}

, а затем для каждого раздела у вас нет результата для:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  if (![section hasRow]) return 0;
}

и

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
  if (![section hasRow]) return 0.0f;
}

правильный способ реализации is:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}

и тогда в каждом разделе будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...

Надеюсь, это поможет!

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}

, и тогда в каждой секции будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...

Надеюсь, это поможет!

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}

, и тогда в каждой секции будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...

Надеюсь, это поможет!

25
ответ дан 29 November 2019 в 00:51
поделиться

Это немного сложно, так как значение 0.0f не принимается. но все, что достаточно близко к нулю, поможет. Если вы решите не быть идеальным по пикселям и хотите округлить числа, то 1.0f сделает почти то же самое, так как разница в высоте в 1 пиксель будет довольно заметна.

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    if(section == 1 )
        return 0.000001f;
    else return 44.0f; // put 22 in case of plain one..
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return 0.000001f; //removing section footers
}
34
ответ дан 29 November 2019 в 00:51
поделиться

У меня была похожая проблема: я загружал UITableView из XIB (такой же как и вы) и предоставлял высоту 0 для некоторых нижних колонтитулов с tableView:heightForFooterInSection (так же, как у вас), но значение было проигнорировано.

Исправление было простым: также установите высоту нижнего колонтитула на 0,0 в XIB. (В Интерфейсном Разработчике выберите Табличное представление, нажмите Command-3, чтобы просмотреть инспектор размера, найдите поле высоты нижнего колонтитула в верхней части)

После того, как это было сделано, он соответствовал пользовательской высоте нижнего колонтитула, как и ожидалось. (Возможно, он рассматривает высоту нижнего колонтитула XIB как минимум?)

3
ответ дан 29 November 2019 в 00:51
поделиться

Это работает для меня:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    tableView.sectionHeaderHeight = (section == 0 ? 10 : 0);
    return tableView.sectionHeaderHeight;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    tableView.sectionFooterHeight = (section == 0 ? 20 : 4);
    return tableView.sectionFooterHeight;
}
1
ответ дан 29 November 2019 в 00:51
поделиться

На самом деле, со мной все происходит наоборот. Я назначил заголовок раздела равным 10 в xib, но для первого раздела мне нужен заголовок заголовка размера. Я использую этот метод в своем UITableViewCotroller

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.section==0)
        return 125;
    return tableView.rowHeight;
}

, но высота заголовка раздела не изменяется, даже если метод вызывается.

0
ответ дан 29 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: