禁用与segue的文本字段交互

时间:2019-01-22 02:30:52

标签: ios swift

我想在用户轻按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!

3 个答案:

答案 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
}

希望有帮助。