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 

  • 相关阅读:
    SSH框架整合-myeclipse
    查看mysql数据库文件存放位置
    Java反射及注解学习- 反射的使用
    线程join方法demo-模拟叫号看病
    线程同步案例
    线程死锁示例
    《广西壮族自治区食品药品监督管理局》代码
    复习点算法知识,水仙花数加冒泡排序,以及一道算法题
    词性标注 HMM
    kd树
  • 原文地址:https://www.cnblogs.com/skyseraph/p/5652131.html
Copyright © 2011-2022 走看看