Я бы порекомендовал использовать одно представление таблицы, как упомянуто @trungduc и @Raj D
Вы должны иметь возможность использовать настраиваемую ячейку представления таблицы для разметки элементов так, как вы хотите, и вы всегда можете использоватькнопки для элементов, которые должны быть активными (например, если вам нужно нажать на элементы меню и показать другой контроллер представления).
Вот базовый макет того, что я имею в виду :
Вы захотите использовать представление стека в ячейке, а затем динамически генерировать элементы меню на основе вашей модели данных поддержки (это должно позволить ему получить правильный внутренний размер контента для UITableViewAutomaticDimension для правильного размера ячеек).
Вот пример того, что я имею в виду, динамически добавляя элементы меню при настройке элемента подменю пользовательской ячейки:
- (void)setupMenuItemsStack:(NSArray <RPMenuItem *> *)menuItems {
for (UIView *subview in self.menuItemsStack.arrangedSubviews) {
[NSLayoutConstraint deactivateConstraints:subview.constraints];
[subview removeFromSuperview];
}
for (RPMenuItem *menuItem in menuItems) {
UIButton *menuItemButton = [UIButton buttonWithType:UIButtonTypeSystem];
[menuItemButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[menuItemButton setTitle:menuItem.title forState:UIControlStateNormal];
[self.menuItemsStack addArrangedSubview:menuItemButton];
}
}
В зависимости от того, как вы структурируете свою модель, методы табличного представления будут выглядеть примерно так:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.menuList.menus.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [[self.menuList.menus objectAtIndex:section] subMenus].count;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [[self.menuList.menus objectAtIndex:section] title];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RPMenuTableViewCell *cell = (RPMenuTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"RPMenuCell" forIndexPath:indexPath];
RPSubMenu *subMenu = [[[self.menuList.menus objectAtIndex:indexPath.section] subMenus] objectAtIndex:indexPath.row];
[cell setSubMenu:subMenu];
return cell;
}
Где список менюсписок меню верхнего уровня, и он идет вниз оттуда (то есть список меню содержит массив меню, меню содержат массив подменю, подменю содержат массив пунктов меню).
@property (strong, nullable) RPMenuList *menuList;
Добавление возможностиРасширение и сжатие (стиль аккордеона), чтобы показать пункты меню, вероятно, было бы также неплохо: