July. 30th 2016
Email:
更多精彩请直接访问:
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.setSelected(select, animated: true) cell.setSelectForDelete(select) // select status UI in UITabViewCell mDownloadList[indexPath.row].selectToDelete = select // Pojo data }}
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
The real problem happened at the cellForRowAtIndexPath / cellForItemAtIndexPath, Which defined in Apple as follows:
public func cellForRowAtIndexPath(indexPath: NSIndexPath) -> UITableViewCell? // returns nil if cell is **not visible** or index path is out of range
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 theUITableViewDataSource 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)// select status UI in UITabViewCell // ... return cell}private func selectCell(indexPath : NSIndexPath, select: Bool) { mDownloadList[indexPath.row].selectToDelete = select // Pojo data mListTableView?.reloadData() // reloadData}
Ref
========
By -2016