Как я могу решить этот вложенный сценарий просмотра таблиц

#ios #uitableview

#iOS #uitableview

Вопрос:

У меня довольно простой сценарий:

Структура данных, которую я ожидаю, по сути, выглядит так (фактический макет намного сложнее):

  • какой-то заголовок
    • n дочерний текст
    • n дочерний текст
    • n дочерний текст
  • какой-то заголовок
    • n дочерний текст
    • n дочерний текст
    • n дочерний текст
    • n дочерний текст
    • n дочерний текст
  • какой-то заголовок
    • n дочерний текст
  • какой-то заголовок
    • n дочерний текст
    • n дочерний текст
    • n дочерний текст
    • n дочерний текст
    • n дочерний текст

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

Естественно, я пошел дальше и исследовал способы отображения динамического вложенного содержимого. К сожалению, мне не удалось найти хороший общий способ сделать это, используя переработку ячеек.

Теперь мне только что пришла в голову идея, которая показалась очень креативной, но очень хакерской.

Что я собираюсь сделать, чтобы использовать переработку ячеек:

Я создам общий класс ячеек для передачи TableView.RegisterClassForCellReuse(typeof(MySpecialCell<ItemType, RandomTypeForUniqueness>), "MySpecialCell" item.Count.ToString());

Настройте мою ячейку в зависимости от количества дочерних элементов.

Мой вопрос:

Есть ли менее сложный способ решить эту проблему? (Потому что это кажется уродливым.)

Вот как это должно выглядеть в конце:

это то, что должно быть расположено так

PS: Я действительно хочу, чтобы RegisterClassForCellReuse принимал фабрики: (

Комментарии:

1. Простая структура данных, которую вы показываете нам в вопросе, может быть показана с помощью простого представления таблицы с использованием разделов. Каждый «некоторый заголовок» будет заголовком раздела, а каждый «дочерний текст» — это просто строка в этом разделе. Поскольку это слишком очевидно и просто, ваши потребности должны быть более сложными, но вы ничего не говорите нам о своих фактических данных.

2. @maddy Теперь я прикрепил изображение из макета. Не уверен, что это выполнимо с заголовками разделов. (Я разрабатываю это с помощью xamarin.iOS, и я на самом деле не разработчик iOS)

3. также я не совсем уверен, почему кто-то проголосовал бы против меня — как я уже сказал, я знаю способ решить мою проблему — мне просто интересно, есть ли лучший способ сделать это

4. Ничто в опубликованном вами экране не указывает на то, что вам следует использовать представление вложенной таблицы. Если бы я должен был это сделать, я бы создал пользовательский вид, который может рисовать каждый «раздел». Это пользовательское представление будет иметь «Beschreibung», «Summe» и график. Теперь вы можете использовать представление таблицы, где каждая ячейка содержит одно из этих пользовательских представлений.

5. @rmaddy я уже пробовал этот подход ранее. к сожалению, в этом случае я тоже столкнулся с проблемами производительности из-за количества ограничений отсутствия рециркуляции ячеек. Спасибо за информацию, хотя

Ответ №1:

Выполните следующие действия:

В .h объявите

 NSMutableArray  *arrayForBool;
NSMutableArray *arrPastOrder;
  

В .m ,

 - (void)viewDidLoad {

arrPastOrder=[[NSMutableArray alloc] init];

int range=1 arc4random()%10;
for(int i=0;i<range;i  )
{
    NSMutableArray *arrinside=[[NSMutableArray alloc] init];
    int range2=3 arc4random()%5;

    for(int j=0;j<range2;j  )
    {
        if(j==0)
            [arrinside addObject:[NSString stringWithFormat:@"Some Header %i",i]];
        else
            [arrinside addObject:[NSString stringWithFormat:@"Subindex %i",j]];

    }

    [arrPastOrder addObject:arrinside];

}

arrayForBool=[[NSMutableArray alloc]init];

for (int i=0; i<[arrPastOrder count]; i  )
{
    [arrayForBool addObject:[NSNumber numberWithBool:YES]];
}
  }



#pragma mark -
#pragma mark TableView DataSource and Delegate Methods

   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {

   if ([[arrayForBool objectAtIndex:section] boolValue])
    {
    return  [[arrPastOrder objectAtIndex:section] count]-1;
    }
   else
    return 0;

   }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
   {


    static NSString *cellid=@"hello";

    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellid];

   if (cell==nil)
   {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellid];
      }


BOOL manyCells  = [[arrayForBool objectAtIndex:indexPath.section] boolValue];

/********** If the section supposed to be closed *******************/
if(!manyCells)
{
    cell.backgroundColor=[UIColor clearColor];

    NSLog(@"cellForRowAtIndexPath---if");

    cell.textLabel.text=@"";
}
/********** If the section supposed to be Opened *******************/
else
{

    //cell.textLabel.text=[NSString stringWithFormat:@"%@ %ld",[sectionTitleArray objectAtIndex:indexPath.section],indexPath.row 1];


    //  ic_keyboard_arrow_up_48pt_2x  ic_keyboard_arrow_down_48pt_2x.png

    cell.textLabel.text=[NSString stringWithFormat:@"%@",[[arrPastOrder objectAtIndex:indexPath.section] objectAtIndex:indexPath.row 1]];


}

cell.textLabel.textColor=[UIColor blackColor];

return cell;

}


 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 {
    return [arrPastOrder count];

  }

     - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
   {


    NSLog(@"%li--%li",(long)indexPath.section, (long)indexPath.row);

  }


    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
      {
       if ([[arrayForBool objectAtIndex:indexPath.section] boolValue]) {
         return 40;
      }
        return 0;

       }

     - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
     {
          return 100;
     }

   #pragma mark - Creating View for TableView Section

    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
     {

UIView *sectionView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 540,100)];
sectionView.backgroundColor=[UIColor whiteColor];
sectionView.tag=section;

UILabel *viewLabel=[[UILabel alloc]initWithFrame:CGRectMake(10, 30, 530, 40)];
viewLabel.backgroundColor=[UIColor whiteColor];
viewLabel.textColor=[UIColor blackColor];
viewLabel.font=[UIFont boldSystemFontOfSize:20];
viewLabel.text=[NSString stringWithFormat:@"%@",[[arrPastOrder objectAtIndex:section] objectAtIndex:0]];
[sectionView addSubview:viewLabel];



/********** Add UITapGestureRecognizer to SectionView   **************/

UITapGestureRecognizer  *headerTapped   = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sectionHeaderTapped:)];
[sectionView addGestureRecognizer:headerTapped];

return  sectionView;


 }


 #pragma mark - Table header gesture tapped

 - (void)sectionHeaderTapped:(UITapGestureRecognizer *)gestureRecognizer{

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:gestureRecognizer.view.tag];    

   //Get which section is open, from here Set the value of arrafool. and expand collapse. Normally whole table is expanded. 


 }
  

Просто запустите его. Вы получите ту же структуру. счастливого кодирования!!