我想在用户轻按tableview的行并应用segue时禁用textfield的用户交互。我在哪里出错了?当我在表视图中选择行时,出现“线程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的详细信息VC类似于
@IBOutlet weak var kmField: UITextField!
答案 0 :(得分:1)
在调用prepareForSegue
时,尚未从情节提要中加载视图,因此您尝试访问隐式解包的可选kmField
的操作会遇到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
}
答案 1 :(得分:0)
您好@efedoganay,您需要了解Viewcontroller的生命周期。函数Prepare不初始化屏幕上的views属性,因此您需要等待一段时间并在其他控制器中进行更改 DetailsViewController viewdidLoad方法。或者作为@paul建议的设置值,该变量应基于该设置互动属性。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
kmfield.isUserInteractionEnabled = false
}
答案 2 :(得分:0)
无法访问类的内部结构,例如Textfield,按钮和标签,这些类是从xib引用的。直到viewLoad这些值为零为止。
最好采用布尔变量,并在tableview didselectrow中将其设置为false。
根据该条件,您可以启用和禁用textfeild。
var isUserInteractionEnable = false
override func viewDidLoad() {
kmfield.isUserInteractionEnabled = isUserInteractionEnable
}
希望有帮助。