Select all the cell in UITabView or UICollectionView problem

1,558 阅读1分钟
原文链接: skyseraph.com

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

UITableView

UICollectionView

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/