【问题标题】:Disable text field interaction with segue禁用与 segue 的文本字段交互
【发布时间】:2019-01-22 02:30:51
【问题描述】:

当用户点击 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!

【问题讨论】:

  • 你应该放一个断点并检查哪个值是 nil。您的问题听起来像是在您到达 textField 之前。将编译器在控制台中遇到的任何问题与您的问题一起发布会很有帮助,因为您的问题的根源可能已经说明了。
  • 我检查了它,编译器将 kmField 视为 nil。
  • 猜测视图尚未渲染。也许您可能想将 kmField.isUserInteractionEnabled = false 移动到 DetailsViewController 的 viewDidLoad/viewDidAppear 并在那里处理它,而不是尝试操作尚未加载的内容。
  • 您是否将情节提要上的这个 segue id 设置为DetailsVC
  • 是的,我做到了。

标签: ios swift


【解决方案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
    }

【讨论】:

    【解决方案2】:

    您好@efedoganay,您需要了解视图控制器的生命周期。功能准备不初始化屏幕上的视图属性,因此您需要等待一段时间并在其他控制器中进行更改交互属性。

    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Do any additional setup after loading the view.
        kmfield.isUserInteractionEnabled = false
    }
    

    【讨论】:

      【解决方案3】:

      无法访问从 xib 引用的类的内部结构,如文本字段、按钮和标签。直到 viewLoad 这些值为零。

      最好采用布尔变量并在 tableview didselectrow 中将其设为 false。

      根据该条件,您可以启用和禁用 textfeild。

      var isUserInteractionEnable = false
      
      override func viewDidLoad() {
        kmfield.isUserInteractionEnabled = isUserInteractionEnable
      }
      
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 2012-04-18
        • 1970-01-01
        • 2019-09-18
        相关资源
        最近更新 更多