首页 > 解决方案 > 禁用与 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!

标签: iosswift

解决方案


调用时视图尚未从情节提要中加载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
    }

推荐阅读