zoukankan      html  css  js  c++  java
  • 【iOS】UITabView/UICollectionView 全选问题

    UITabView/UICollectionView 全选问题

    SkySeraph July. 30th 2016

    Email:skyseraph00@163.com

    更多精彩请直接访问SkySeraph个人站点www.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.setSelected(select, animated: true)
            cell.setSelectForDelete(select)  // select status UI in UITabViewCell
            mDownloadList[indexPath.row].selectToDelete = select  // Pojo data
        }
    }
    View Code

    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
        }
    }
    View Code

    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? 
    // 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 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)// 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

    UITableView

    UICollectionView  

    SYNC POST

    ========  

     By SkySeraph-2016  www.skyseraph.com 

  • 相关阅读:
    Tempter of the Bone
    CODE[VS]1160 蛇形矩阵
    CODE[VS] 1205 单词翻转
    CODE[VS] 1204 寻找子串位置
    a little sweet~
    我多喜欢你,你会知道
    P1474 货币系统 Money Systems
    P1096 Hanoi双塔问题
    P1209 [USACO1.3]修理牛棚 Barn Repair
    下一秒
  • 原文地址:https://www.cnblogs.com/skyseraph/p/5652131.html
Copyright © 2011-2022 走看看