我目前正在学习如何以编程方式构建应用程序,并在此过程中遇到了一些障碍。
我的应用程序将是一个用户可以填写的相当简单的表单,它将在最后生成包含信息的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)
}
}
}
}
但是当这个运行时,我收到错误信息&#34;在解开一个Optional值时意外地发现了nil&#34;它特别突出了这一行:
let thisCell = secondTableView.cellForRow(at: indexPath as IndexPath) as! mySecondCell
这段代码几乎与我成功迭代UITextfields的方式相同,所有改变的是附加的变量,据我所知,没有选项。 此外,如果我没有填写UITextviews,它将显示UIAlertController,当我删除占位符并填写UITextviews时,它似乎只有问题。 有没有人有任何关于为什么会这样的想法?如果需要,我可以提供更多代码。
答案 0 :(得分:0)
这是您的可选
private
显然,as! mySecondCell
不是thisCell
检查您是否注册了正确的课程
修改强>
你不应该自己调用委托方法
答案 1 :(得分:0)
这里是迭代加载单元格。所以问题是由于您要加载/访问不可见的单元格而引起的。
这里你不应该加载cellForRowAtIndexPath的单元格。
原因: UITableView正在重复使用带有reusableCellIdentifier 的单元格。
这里需要在调用textfield-didEndEditing时保存数组或字典中的值(textfield delegate方法)。 对于验证检查,您可以使用数组/字典中保存的值。