The Issue
Recently in my new project I need to select all the cell data in my UITabViewCell and UICollectionViewCell, and need to do some operations with all the cells(like delete etc.), What I do as follows:
UITabView
private func selectAll(select: Bool) {
let numSections = mListTableView?.numberOfSections
if let numSections = numSections {
for numSection in 0 ..< numSections{
let numItems = mListTableView?.numberOfRowsInSection(numSection)
if let numItems = numItems {
for numItem in 0 ..< numItems {
selectCell(NSIndexPath(forRow: numItem, inSection: numSection), select: select)
}
}
}
}
}
private func selectCell(indexPath : NSIndexPath, select: Bool) {
if mListTableView?.cellForRowAtIndexPath(indexPath) != nil {
let cell = mListTableView?.cellForRowAtIndexPath(indexPath) as! DownloadListViewCell
cell.setSelectForDelete(select)
mDownloadList[indexPath.row].selectToDelete = select
}
}
UICollectionView
private func selectAll(select: Bool) {
let numSections = mMyOfflineCollectView?.numberOfSections()
if let numSections = numSections {
for numSection in 0 ..< numSections{
let numItems = mMyOfflineCollectView?.numberOfItemsInSection(numSection)
if let numItems = numItems {
for numItem in 0 ..< numItems {
selectCell(NSIndexPath(forRow: numItem, inSection: numSection), flag: select)
}
}
}
}
}
private func selectCell(indexPath : NSIndexPath, flag: Bool) {
if mMyOfflineCollectView.cellForItemAtIndexPath(indexPath) != nil {
let cell = mMyOfflineCollectView.cellForItemAtIndexPath(indexPath) as! MyOfflineCollectionViewCell
cell.setSelect(flag)
if flag {
mMyOfflineCollectView.selectItemAtIndexPath(indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.None)
}else {
mMyOfflineCollectView.deselectItemAtIndexPath(indexPath, animated: true)
}
mMyofflinesData[indexPath.row].needDelete = flag
}
}
But, The problem is , I can only select the visible cell when I scoll down or up, or do operations
Solutions in NetWork
UICollectionView cellForItemAtIndexPath is nil
cellForItemAtIndexPath returns nil after force scrolling to make it visible
Select all the cells in UITableView
Easier way to select all rows in UITableView
tableView.cellForRowAtIndexPath returns nil with too many cells (swift)
tableView.cellForRowAtIndexPath(indexPath) return nil
The real Solution
The real problem happened at the cellForRowAtIndexPath / cellForItemAtIndexPath, Which defined in Apple as follows:
public func cellForRowAtIndexPath(indexPath: NSIndexPath) -> UITableViewCell?
public func cellForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewCell?
When the cell is not visible, the cellForRowAtIndexPath will return nil, So, it’s not the right way to do the cell select operation out the UITableViewDataSource in cellForRowAtIndexPath (UITabView), you should do it separate. The right way as follows:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(DOWNLOAD_LIST_CELL_INDENTIFIER, forIndexPath: indexPath) as! DownloadListViewCell
cell.selectionStyle = UITableViewCellSelectionStyle.None
cell.setSelectForDelete(self.mDownloadList[indexPath.row].selectToDelete)
return cell
}
private func selectCell(indexPath : NSIndexPath, select: Bool) {
mDownloadList[indexPath.row].selectToDelete = select
mListTableView?.reloadData()
}
Ref
By SkySeraph-2016版权声明
SkySeraph by SkySeraph is licensed under a Creative Commons BY-NC-ND 4.0 International License. 由Bob创作并维护的SkySeraph博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证. 本文首发于SkySeraph博客( skyseraph.com ),版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。微信扫码打赏SkySeraph
如果您愿意捐助其它金额请戳我~~,扫码支付宝/微信
本文永久链接:skyseraph.com/2016/06/30/… all the cell in UITabView or UICollectionView problem/