ios - 禁用与 segue 的文本字段交互
问题描述
当用户点击 tableview 的行并应用 segue 时,我想禁用 textfield 的用户交互。我哪里出错了?当我在 tableview 中选择行时,我收到“线程 1:致命错误:在展开可选值时意外发现 nil”错误。
这是我的 ViewController 类及其必要的功能
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.selectedTrip = dateArray[indexPath.row]
performSegue(withIdentifier: "toDetailsVC", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toDetailsVC" {
let destinationVC = segue.destination as! detailsViewController
destinationVC.kmField.isUserInteractionEnabled = false
}
}
和 kmField 在 detailsVC 中就像
@IBOutlet weak var kmField: UITextField!
解决方案
调用时视图尚未从情节提要中加载prepareForSegue
,因此您尝试访问隐式展开的可选选项会kmField
命中 a nil
。
直接从外部访问类的内部结构(例如文本字段)通常是个坏主意。
我建议您添加一个布尔属性,例如isEditable
,然后您可以使用它viewDidLoad
来设置您的视图控制器:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationVC = segue.destination as? DetailsViewController
destinationVC.isEditable = false
}
}
顺便说一句,按照惯例,您的视图控制器类应该是DetailsViewController
class DetailsViewController {
var isEditable = true
@IBOutlet private weak var kmField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.kmField.isUserInteractionEnabled = self.isEditable
}
推荐阅读
- angular - What is the proper way to return from within an angular subscription?
- java - Can I force my Android app to update from the Play Store?
- java - 我的回收器视图适配器返回 null
- uiaccessibility - 手风琴模式和披露模式有什么区别?
- c# - 控制台项目的 Visual Studio 2017 中出现 C# 错误,并且找不到调试选项
- python-3.x - 如何改进我的回合制游戏循环代码
- docker - NGINX proxy_pass 到 RabbitMQ 管理器只能通过移动设备工作
- microsoft-graph-api - 提取 skiptoken 以安全地发出下一个请求
- powershell - 在全屏模式下打开一个 Chrome 进程,然后稍后关闭该进程。
- ios - 解析 XML 并将其附加到结构 - 如何正确访问结构变量?