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 

  • 相关阅读:
    python 装饰器
    python 环境迁移之requirements.txt (window环境)
    selenium 元素查找与属性
    pytest+allure(allure-pytest基于这个插件)设计定制化报告
    Capability配置
    python_excel
    python_连接mysql
    MySql_1
    appium_环境搭建
    appium_appium简介
  • 原文地址:https://www.cnblogs.com/skyseraph/p/5652131.html
Copyright © 2011-2022 走看看