2016-07-14 2 views
2

У меня есть представление коллекции, этот вид коллекции имеет 3 раздела:Как скрыть/показать раздел Collection View

B

C

Затем я хочу скрыть раздел B, тогда он будет выглядеть так:

C

Я попытался

collectionView.deleteSections(NSIndexSet(index: 1)) 

, но он падает и говорит:

Нагрузочный приложение из-за неперехваченного исключением 'NSInternalInconsistencyException', причина : «Неверное обновление: недействительно количество разделов. Количество разделов, содержащихся в представлении коллекции после обновления (3), должно быть равно числу разделов , содержащихся в представлении коллекции до обновления (3), плюс или за вычетом количества вставленных или удаленных разделов (0 вставлен, 1 удален). '

+2

Вы должны удалить раздел из источника данных и перезагружать представление коллекции с помощью вызова 'reloadData'. Это вызовет 'func numberOfSectionsInCollectionView (_ collectionView: UICollectionView) -> Int', где будет возвращено обновленное количество разделов. – fiks

+0

Поскольку я хочу его повторно использовать, я просто хочу скрыть/показать раздел, поэтому удалить раздел данных не будет хорошо в моем случае. – Khuong

+0

Если вы хотите удалить источник данных, как говорит @fiks, попробуйте сделать размер раздела равным нулю? – childrenOurFuture

ответ

3

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

Я пишу код на лету, использовать его в качестве отправной точки, чтобы понять концепцию:

var sections = 3 
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
    return sections 
} 

func removeSectionOne() { 
    sections = 2 
    collectionView.deleteSections(NSIndexSet(index: 1)) 
    // At this point the collection view will ask again for the number of sections and it will be updated 
} 
+0

Я думаю, мне нужно иметь 2 массива. Один исходный массив и один массив для управления. – Khuong

+0

все, что лучше всего подходит для вас.Дело в том, что у вас есть две вещи для обновления: 1) модель представления, поэтому сообщаем в виде коллекции для добавления/удаления разделов/ячеек и 2) модели данных, которая используется для формирования представления коллекции. Эти две вещи должны быть последовательными, поэтому, если вы попросите удалить раздел, ваши методы dataSource также должны вернуть один раздел меньше. –

1

я сделал то же самое с Tableview,

первый

BOOL sectionIsOpen[2]; // Your Sections number (3 in your case) 

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  { 
     return self.arrMenu.count; 
    } 

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return ((sectionIsOpen[section]) ? [self numberOfRowsInSection:section] : 0); 
     } 

[self numberOfRowsInSection:section Содержит номер изделия в разделе

И когда вы необходимо скрыть раздел прохода в методе и

for (NSInteger row = 0; row < [self numberOfRowsInSection:section]; row ++) { 
     [indxPths addObject: [NSIndexPath indexPathForRow:row inSection:section] 
     ]; 
    } 
    [self.tblMenu beginUpdates]; 
    if (open) { 
     [self.tblMenu insertRowsAtIndexPaths:indxPths withRowAnimation:UITableViewRowAnimationFade]; 
    }else{ 
     [self.tblMenu deleteRowsAtIndexPaths:indxPths withRowAnimation:UITableViewRowAnimationFade]; 

    } 
    sectionIsOpen[section] = open; 
    [self.tblMenu endUpdates]; 

Надеется, что это помогает .....