Расширяемый tableView в iphone

введите описание изображения здесь

Я хочу сделать этот тип расширяемого / разборного вида таблицы. есть категории и подкатегории, как на картинке. например, «здоровье и красота» – это категория, и когда я нажимаю эту ячейку, чем ее открытые подкатегории, как на рисунке ниже. Итак, как я могу сделать этот вид таблицы? пожалуйста, предложите мне.

12 Solutions collect form web for “Расширяемый tableView в iphone”

Наконец, я получаю две очень полезные ссылки для ссылок ниже, в которых описывается то, что здесь требуется. Развертывание / сворачивание разделов TableView
Складной вид таблицы для iOS

Действительно, хорошие статьи для такого рода расширяющихся / разрушающихся разделов таблицы

Используйте следующий код для расширяемой ячейки в UITableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } cell.textLabel.text=[[self.arForTable objectAtIndex:indexPath.row] valueForKey:@"name"]; [cell setIndentationLevel:[[[self.arForTable objectAtIndex:indexPath.row] valueForKey:@"level"] intValue]]; return cell; } 

код для расширения и свертывания строк – TableView DidSelectRow Method

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; NSDictionary *d=[self.arForTable objectAtIndex:indexPath.row]; if([d valueForKey:@"Objects"]) { NSArray *ar=[d valueForKey:@"Objects"]; BOOL isAlreadyInserted=NO; for(NSDictionary *dInner in ar ){ NSInteger index=[self.arForTable indexOfObjectIdenticalTo:dInner]; isAlreadyInserted=(index>0 && index!=NSIntegerMax); if(isAlreadyInserted) break; } if(isAlreadyInserted) { [self miniMizeThisRows:ar]; } else { NSUInteger count=indexPath.row+1; NSMutableArray *arCells=[NSMutableArray array]; for(NSDictionary *dInner in ar ) { [arCells addObject:[NSIndexPath indexPathForRow:count inSection:0]]; [self.arForTable insertObject:dInner atIndex:count++]; } [tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft]; } } } 

Метод, который поможет минимизировать и максимизировать / развернуть-свернуть строки.

 -(void)miniMizeThisRows:(NSArray*)ar{ for(NSDictionary *dInner in ar ) { NSUInteger indexToRemove=[self.arForTable indexOfObjectIdenticalTo:dInner]; NSArray *arInner=[dInner valueForKey:@"Objects"]; if(arInner && [arInner count]>0){ [self miniMizeThisRows:arInner]; } if([self.arForTable indexOfObjectIdenticalTo:dInner]!=NSNotFound) { [self.arForTable removeObjectIdenticalTo:dInner]; [self.tableView deleteRowsAtIndexPaths: [NSArray arrayWithObject:[NSIndexPath indexPathForRow:indexToRemove inSection:0]] withRowAnimation:UITableViewRowAnimationRight]; } } } 

Вы можете скачать исходный код здесь.

Если это помогает: [Доступ к расширяемым и расширяемым разделам uifyview] https://github.com/OliverLetterer/UIExpandableTableView

Попробуйте использовать этот код … Может быть, это может помочь. И не стесняйтесь редактировать код в соответствии с вашими требованиями …

 #import "ViewController.h" #import <QuartzCore/QuartzCore.h> @interface ViewController () @end @implementation ViewController @synthesize myTable; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //myTable.backgroundColor=[UIColor clearColor]; // self.view.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"wood.png"]]; muArr= [[NSMutableArray alloc]initWithObjects:@"Vinay",@"Anmol",@"Jagriti", nil]; ExpArr=[[NSMutableArray alloc]initWithObjects:@"Useeee",@"Thissss",@"Codeee", nil]; otherExpand=100; checker=100; } -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { return muArr.count; } -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if(otherExpand==section) return ExpArr.count; return 0; } -(BOOL)tableView:(UITableView *)table canCollapse:(NSIndexPath *)indexPath { return NO; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *Identifier=@"Cell"; UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:Identifier]; if (cell==nil) { cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Identifier]; } cell.textLabel.text=[ExpArr objectAtIndex:indexPath.row]; cell.textLabel.backgroundColor=[UIColor clearColor]; UIView *viewww=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; viewww.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"wood.png"]]; cell.backgroundView=viewww; // cell.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"wood.png"]]; [tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLineEtched]; [tableView setSeparatorColor:[UIColor purpleColor]]; return cell; } -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *view1=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 44)]; [view1.layer setCornerRadius:20]; view1.layer.borderWidth=2; view1.layer.borderColor=[UIColor brownColor].CGColor; UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(10, 0, 295, 44)]; label.backgroundColor=[UIColor clearColor]; label.text=[muArr objectAtIndex:section]; UIButton *btn=[UIButton buttonWithType:UIButtonTypeDetailDisclosure]; btn.frame=CGRectMake(280, -5, 50, 50); btn.backgroundColor=[UIColor clearColor]; btn.tag=section; view1.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"wood.png"]]; label.textColor=[UIColor blackColor]; label.font=[UIFont fontWithName:@"American TypeWriter" size:18]; //btn.backgroundColor=[UIColor blackColor]; [view1 addSubview:btn]; [view1 addSubview:label]; [btn addTarget:self action:@selector(Btntap:) forControlEvents:UIControlEventTouchUpInside]; return view1; } -(void)Btntap : (UIButton *)btn { if(otherExpand!=100) { if (otherExpand==btn.tag) { NSMutableArray *tempArr2=[[NSMutableArray alloc]init]; for(int j=0;j<ExpArr.count;j++) { NSIndexPath *indexx1=[NSIndexPath indexPathForRow:j inSection:otherExpand]; [tempArr2 addObject:indexx1]; } checker=0; otherExpand=100; [myTable deleteRowsAtIndexPaths:tempArr2 withRowAnimation:UITableViewRowAnimationAutomatic]; } else { NSMutableArray *tempArr2=[[NSMutableArray alloc]init]; for(int j=0;j<ExpArr.count;j++) { NSIndexPath *indexx1=[NSIndexPath indexPathForRow:j inSection:otherExpand]; [tempArr2 addObject:indexx1]; } checker=1; otherExpand=100; [myTable deleteRowsAtIndexPaths:tempArr2 withRowAnimation:UITableViewRowAnimationAutomatic]; } } if(checker!=0) { otherExpand=btn.tag; //checker= NSMutableArray *tempArr=[[NSMutableArray alloc]init]; for(int i=0;i<ExpArr.count;i++) { NSIndexPath *indexx=[NSIndexPath indexPathForRow:i inSection:btn.tag]; [tempArr addObject:indexx]; } [myTable insertRowsAtIndexPaths:tempArr withRowAnimation:UITableViewRowAnimationAutomatic]; checker=1; } checker=100; } -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 44; } @end 

У меня есть немного другой подход к расширяемым табличным представлениям – тот, который согласуется с тем, как эти виды представлений таблиц обычно построены.

Есть заголовки и есть ячейки . Заголовки должны быть поддающимися отображению , а затем ячейки под заголовками будут отображаться или скрываться . Это может быть достигнуто добавлением распознавателя жестов в заголовок, и при нажатии, вы просто удалите все ячейки под этим заголовком (раздел) и наоборот (добавьте ячейки). Конечно, вы должны поддерживать состояние, в котором заголовки «открыты», а заголовки «закрыты».

Это приятно по нескольким причинам:

  1. Работа заголовков и ячеек разделяется, что делает код чище.
  2. Этот метод прекрасно сочетается с тем, как построены представления таблиц (заголовки и ячейки), и, следовательно, не так много магии – код просто удаляет или добавляет ячейки и должен быть совместим с более поздними версиями iOS.

Для этого я создал очень простую библиотеку. Пока ваше представление таблицы настроено с заголовками и ячейками раздела UITableView, все, что вам нужно сделать, это подкласс tableview и заголовок. Попробуй 🙂

Ссылка: https://github.com/fuzz-productions/FZAccordionTableView

введите описание изображения здесь

В WWDC 2011 есть отличное видео, которое называется UITableView Changes, Tips and Tricks – сеанс 125, который показывает, как делать такие вещи.
Также посмотрите пример кода TVAnimationsGestures

Вы можете взглянуть на этот аккордеонный пример в Swift: https://github.com/tadija/AEAccordion

введите описание изображения здесь

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

Попробуйте этот пример:

лучший пример для расширяемого TableView

https://github.com/OliverLetterer/UIExpandableTableView

TLIndexPathTools может делать это естественно. На самом деле существуют расширения для расширяемых разделов и расширяемых древовидных структур. Попробуйте запустить пример проекта Collapse для расширяемых разделов и проект образца Outline для расширяемых деревьев.

Одним из преимуществ использования TLIndexPathTools является то, что в качестве простого низкоуровневого API он может решать все виды задач динамического представления таблиц и сбора данных с использованием общего подхода. И он работает взаимозаменяемо с Core Data и обычными массивами.

Проверьте эту ссылку:

http://iostechnotips.blogspot.in/2014/05/expandable-uitableview.html

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

* Используйте метод делегата UITableView viewForHeaderInSection и верните пользовательский UIView.

* Добавить UIButton как subview с действием «expandable: (id) отправитель» проверить идентификатор отправителя как номер раздела и перезагрузить представление таблицы.

В файле .h

 LoadCustomCell *cell1; NSMutableArray *arrayForBool; NSMutableArray *questionArray; NSMutableArray *answerArray; 

В вашем файле .m

  viewDidLoadMethod { _faqTblView.estimatedRowHeight = 30; _faqTblView.rowHeight = UITableViewAutomaticDimension; arrayForBool = [[NSMutableArray alloc]init]; _questionArray = [[NSMutableArray alloc]init]; _answerArray = [[NSMutableArray alloc]init]; for (int i = 0; i < _questionArray.count; i++) { [arrayForBool addObject:@"0"]; } self.faqTblView.dataSource = self; self.faqTblView .delegate = self; [self.faqTblView reloadData]; } 

после этого

  #pragma mark - TableView Datasource & Delegate Method. -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [_questionArray count]; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { UILabel *lblText = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 260, 100)]; lblText.text = [_questionArray objectAtIndex:section]; return [lblText getLabelHeight] + 20;(created custom class) } -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UITapGestureRecognizer *headerTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sectionHeaderTapped:)]; cell1 = [[[NSBundle mainBundle] loadNibNamed:@"LoadCustomCell" owner:self options:nil] objectAtIndex:0]; [cell1 setFrame:CGRectMake(0, 0, cell1.frame.size.width, cell1.frame.size.height)]; NSString *numStr = [NSString stringWithFormat:@"%ld. ",section + 1]; [cell1.sideMenuUserNameLabel setText:[numStr stringByAppendingString:[_questionArray objectAtIndex:section]]]; [cell1 setBackgroundColor:[UIColor lightGrayColor]]; cell1.tag = section; [cell1 addGestureRecognizer:headerTapped]; return cell1; } - (void)sectionHeaderTapped:(UITapGestureRecognizer *)gestureRecognizer { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:gestureRecognizer.view.tag]; if (indexPath.row == 0) { BOOL collapsed = [[arrayForBool objectAtIndex:indexPath.section] boolValue]; for (int i = 0; i < [_questionArray count]; i++) { if (indexPath.section==i) { [arrayForBool removeObjectAtIndex:i]; [arrayForBool insertObject:[NSString stringWithFormat:@"%d", !collapsed] atIndex:i]; } } NSLog(@"%@", arrayForBool); [self.faqTblView reloadSections:[NSIndexSet indexSetWithIndex:gestureRecognizer.view.tag] withRowAnimation:UITableViewRowAnimationAutomatic]; for (NSIndexPath *indexPath in self.faqTblView.indexPathsForSelectedRows) { [self.faqTblView deselectRowAtIndexPath:indexPath animated:NO]; } cell1.imageView.transform = CGAffineTransformMakeRotation(M_PI); } } -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *questionCellIdentifier = @"questionCellIdentifier"; QuestionCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:questionCellIdentifier]; if (cell == nil) { NSArray * myNib; myNib =[[NSBundle mainBundle]loadNibNamed:@"QuestionCustomCell" owner:self options:nil]; cell = (QuestionCustomCell *)[myNib lastObject]; } BOOL manyCells = [[arrayForBool objectAtIndex:indexPath.section] boolValue]; if(manyCells){ cell.questionNameLbl.text = [_answerArray objectAtIndex:indexPath.section]; } return cell; } 

Вы можете использовать ExpyTableView

Что делает расширяемый раздел из вашей ячейки. Совместимость с iOS 8.0. У вас будет гибкость, создавая расширяемое табличное представление с несколькими ячейками просмотра таблицы. Просто манипулируйте разделителями для состояний, и тогда никто не узнает, что вы используете несколько ячеек для расширения.

  • Другие решения. Вы управляете высотой, чтобы развернуть ячейку, когда требуется обновление в дизайне ячейки, вам нужно перестроить все ограничения автоматической компоновки или логику в коде.

  • ExpyTableView: вы создаете расширяемый вид таблицы, используя несколько ячеек и вставляя и удаляя их (что может означать расширение и сведение), у вас будет большой шанс в будущих запросах на дизайн. Все, что вам нужно сделать, это добавить новый UITableViewCell и написать код для него. У вас будет новый дизайн.

Все, что вам нужно сделать, это import ExpyTableView а затем:

 class ViewController: ExpyTableViewDataSource, ExpyTableViewDelegate { @IBOutlet weak var expandableTableView: ExpyTableView! // First, set data source and delegate for your table view. override func viewDidLoad() { super.viewDidLoad() expandableTableView.dataSource = self expandableTableView.delegate = self } // Then return your expandable cell instance from expandingCell data source method. func expandableCell(forSection section: Int, inTableView tableView: ExpyTableView) -> UITableViewCell { // this cell will be displayed at IndexPath with section: section and row 0 } } 

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

  • IBAction func правильно подключен, но не выполняет
  • Невозможно преобразовать тип выражения «StaticString» в тип «StringLiteralConvertible» (Swift)
  • Приложение iPhone после тестирования несколько дней спустя
  • Причина аварийного сбоя iOS ARC в оптимизированной сборке XCode 6.4?
  • Нет опции Retina 4 в xcode 7, то как мне установить полноэкранные изображения в актив, чтобы они отображались правильно в 4s / 5s & iPhone 6?
  • Swift: ошибка сегментации 11 при импорте файлов в заголовок заголовка
  • Как правильно создать раскадровку в xCode6 с помощью Interface Builder и Swift
  • ios Основные данные о том, как реализовать транзакционную функцию sql?
  • Как выполнить отмену операции в iOS для хранения UIGraphicsContext?
  • Распределение OTA AdHoc - как построить IPA из командной строки?
  • Использует ли это приложение флаги рекламного идентификатора
  • Interesting Posts

    Как добавить слайд для разблокировки эффекта в UITextView или UILabel?

    Как отклонить UIPopover от кнопки в Popover с помощью IOS 8 XCode 6 beta

    Есть ли контроллер просмотра для обрезки и поворота изображения, например, iOS 8 photo.app?

    Как очистить все кэшированные изображения, загруженные из SDWebImage?

    Менеджер местоположения didExitRegion не был вызван

    removeAllCachedResponses не может очистить sharedURLCache?

    Как отменить NSOperationQueue

    Режим масштабирования MPMoviePlayerController после выхода из полноэкранного режима

    UIPanGestureRecognizer конфликтует с scrollview

    Поиск количества каналов с AVAsset

    iOS CoreBluetooth: сохранение и восстановление состояния

    Как я могу проверить, находится ли заголовок UICollectionView в настоящее время в представлении rect?

    Приложение попыталось нажать контроллер представления nil на цель <MFMessageComposeViewController: 0x96d1380>

    UIActivityViewController не может добавить изображение в изображение

    Запрос атрибута указателя с использованием Parse

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.