我有一个包含文本字段矩阵的UICollectionView。由于每行的文本字段数可能很高,因此我实现了自定义UICollectionViewLayout以允许在此屏幕中滚动。当用户提交表单时,我想验证在每个文本字段中输入的值,因此我需要循环所有单元格。
我面临的问题是我正在使用collectionView.cellForItemAtIndexPath,但后来发现它失败了隐形单元格,正如我在this question上看到的那样。
我理解答案中的方法来存储数据源的值(在数组中),然后循环数据源,但是我不知道如何做到这一点。我尝试使用函数editingDidEnd作为与文本字段关联的@IBAction,但我不知道如何获得"坐标"该文本字段。我的想法是将用户输入的值存储在一个二维数组中,稍后我将使用它来循环和验证。
非常感谢您的帮助!
答案 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
}
}