• 【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 

  • 相关阅读:
    Python float() 函数
    Python bytearray() 函数
    scanner.nextInt()与scanner.nextDouble
    Scanner对象next与nextLine
    JavaDoc
    包机制
    运算符要点
    变量与常量
    test
    类型转换
  • 原文地址:https://www.cnblogs.com/skyseraph/p/5652131.html
Copyright © 2020-2023  润新知