如何在UICollectionView中循环隐藏单元格

时间:2015-10-12 22:22:54

标签: ios swift uicollectionview

我有一个包含文本字段矩阵的UICollectionView。由于每行的文本字段数可能很高,因此我实现了自定义UICollectionViewLayout以允许在此屏幕中滚动。当用户提交表单时,我想验证在每个文本字段中输入的值,因此我需要循环所有单元格。

我面临的问题是我正在使用collectionView.cellForItemAtIndexPath,但后来发现它失败了隐形单元格,正如我在this question上看到的那样。

我理解答案中的方法来存储数据源的值(在数组中),然后循环数据源,但是我不知道如何做到这一点。我尝试使用函数editingDidEnd作为与文本字段关联的@IBAction,但我不知道如何获得"坐标"该文本字段。我的想法是将用户输入的值存储在一个二维数组中,稍后我将使用它来循环和验证。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

你不必循环隐形细胞。继续使用数据源方法。您正在寻找的是将textFields映射到数据源的方法。

有很多解决方案,但很容易使用Dictionary

以下是UITableViewDataSource的代码,但您可以将其应用于UICollectionViewDataSource

class MyCustomCell: UITableViewCell{
    @IBOutlet weak var textField: UITextField!
}

class ViewController: UIViewController{

    // datasource
    var textSections = [ [ "one" , "two" , "three"] , [ "1" , "2" , "3"] ]

    // textField to datasource mapping
    var textFieldMap: [UITextField:NSIndexPath] = [:]


    // MARK: - Action
    func textChanged(sender: UITextField){

        guard let indexPath = textFieldMap[sender] else { return }
        guard let textFieldText = sender.text else { return }
        textSections[indexPath.section][indexPath.row] = textFieldText
    }

    @IBAction func submitButtonTapped(){

        // validate texts here
        for textRow in textSections{
            for text in textRow{
                if text.characters.count <= 0{
                    return print("length must be > 0.")
                }
            }
        }

        performSegueWithIdentifier("goToNextPage", sender: self)
    }

}

extension ViewController: UITableViewDataSource{

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("identifer") as! MyCustomCell

        // set value corresponds to your datasource
        cell.textField.text = textSections[indexPath.section][indexPath.row]

        // set mapping
        textFieldMap[cell.textField] = indexPath

        // add action-target to textfield
        cell.textField.addTarget(self, action: "textChanged:", forControlEvents: .EditingChanged)

        return cell
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return textSections[section].count
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return textSections.count
    }

}