2017-02-16 60 views
0

我目前正在学习如何以编程方式完全构建应用程序,并在过程中遇到了一些问题。使用Swift在TableView中迭代UITextViews使用Swift

我的应用程序将会是一个非常简单的表单,用户可以填写它,并且会在包含信息的末尾生成PDF。对于基本信息,我有一个包含一组UITextfields的tableview,并且没有任何问题通过它们迭代并将数据提取到一个字符串数组中。 对于下一节,用户需要输入更多的文本,所以我在tableview中使用了UITextviews。我想要做的是提取输入的文本并将其保存到用于创建我的客户对象的字符串数组中。执行此代码如下:

func createGoals() { 
    for section in 0..<secondTableView.numberOfSections { 

     for row in 0..<secondTableView.numberOfRows(inSection: section) { 

      let indexPath = NSIndexPath(row: row, section: section) 
      let thisCell = secondTableView.cellForRow(at: indexPath as IndexPath) as! mySecondCell 
       if thisCell.textview.text == "Enter Goals" { 
       print("NO CONTENT IN FIELD") 
       let ac = UIAlertController(title: "But...But...", message: "If you have no goals, how can you progress?!", preferredStyle: .alert) 
       ac.addAction(UIAlertAction(title: "OK", style: .default)) 
       present(ac, animated: true) 
       break 
       } else { 
        print("I MADE IT") 
        print("\(thisCell.textview.text!)") 
        newClient.goalArray.append(thisCell.textview.text) 
        print(newClient.goalArray) 
        } 
     } 
    } 

} 

但是,当它运行我得到错误信息“意外发现零,同时展开一个可选值”,并特别强调了这一行:

let thisCell = secondTableView.cellForRow(at: indexPath as IndexPath) as! mySecondCell 

这代码与我如何成功遍历UITextfields几乎完全相同,所有变化都是附加的变量,并且据我所见,没有可选项。 另外,如果我没有填写UITextviews,它将显示UIAlertController,它只是在我删除占位符并填写UITextviews时似乎有问题。 有没有人有任何想法,为什么发生这种情况?如果需要,我可以提供更多的代码。

+0

调试器告诉你,secondTableView在你传递的行中不包含任何单元格。验证secondTableView的行数应该有所帮助。 – ystack

+0

我刚刚在调试器中尝试过,并且它正在按照预期在部分0中返回4行。行肯定存在,那么我的for循环可能会错过一个? – EtherCode

+0

mySecondCell似乎是一个实例,而不是一个类。您需要将单元格作为类类型即。 let thisCell = secondTableView.cellForRow(at:indexPath as IndexPath)as! MyCellSubclass'或甚至更好的使用警卫'警卫let thisCell = secondTableView.cellForRow(在:indexPath作为IndexPath)? mySecondCell else {return}' –

回答

0

这是您的选购

as! mySecondCell 

显然,thisCell不是mySecondCell

检查,如果你没有注册正确类

编辑

你不应该自己拨打代理方式

+0

哦,我没有意识到,仍然算作可选,我认为强迫downcasts是不同的。以下是我如何注册它,我很确定它是正确的? 在VDL: 'secondTableView.delegate =自 secondTableView.dataSource =自 secondTableView.register(mySecondCell.self,forCellReuseIdentifier: “secondCellID”)', 同样在cellForRow: “如果的tableView ==自.secondTableView让bCell = secondTableView.dequeueReusableCell(withIdentifier:“secondCellID”,for:indexPath)as! mySecondCell', 这是注册正确的方法吗? – EtherCode

+0

你可能是对的。我没有注意你在哪里使用这段代码。您应该阅读Kalpesh jetani的答案。他是对的,你不能自己调用​​委托方法 – Acrasia

0

在这里您正在加载单元格迭代。所以问题是由于您要加载/访问不可见的单元格造成的。

这里你不应该加载cellForRowAtIndexPath的cell侧。

原因:UITableView正在重复使用带有可重复使用的CellIdentifier的单元。

这里您需要在textfield-didEndEditing调用(textfield委托方法)时将值保存在数组或字典中。 和验证检查您可以使用从数组/字典中保存的值。

+0

好吧,我会尝试这种方式,看看。 只是出于兴趣是否有任何理由加载迭代中的单元格时,完美迭代通过textFields但不使用textViews时? – EtherCode

+0

如果它使用textFields,那么它应该在textViews不起作用时使用。 如果你迭代tableview.visiblecells你不会得到上述问题。但在这里你的任务并不完整。所以为了从textviews/Textfields获得修改后的值,您需要将其保存在didEndEditing上。 还有问题,请检查类别/扩展或超类。 –