【问题标题】:unwind segue cancel upon textbox value equal to nil在文本框值等于 nil 时展开 segue 取消
【发布时间】:2018-03-09 21:46:20
【问题描述】:

如果文本框的值等于 nil,我想取消展开转场。 以下是当前代码。我使用故事板连接保存按钮(将文本值保存到数据库中)。我正在考虑使用 poptorootviewcontroller 来确保教科书在执行 segue 之前具有值。他们有什么方法可以用当前代码做到这一点吗?

mainView 内的代码以展开回-

@IBAction func unwind(_ segue: UIStoryboardSegue){
    print("Back in TableView")

}

childView 上的按钮执行 unwind segue-

 @IBAction func saveAddress(_ sender: UIButton) {
    // save values to dictionary save dictionary to firebase under user, uid, addresses
    // uialert controller if fields are not completed do not allow segue if fields are not complete
    // perform segue to addresstableview

    let addy1: String = address1Txt.text!
    let addy2: String = address2Txt.text!
    let aptNum: String = aptTxt.text!
    let city: String = cityTxt.text!
    let state: String = stateTxt.text!
    let zip: String = zipTxt.text!

    // add UIAlert controller for address field == nothing
    if addy1.isEmpty && aptNum.isEmpty && city.isEmpty && state.isEmpty && zip.isEmpty
    {
        //add UIAlert Controller DO NOT PERFORM SEGUE IF TRUE
    }

    Address.sharedInsance.typedNewAddress = addy1 + "," + addy2 + "," + aptNum + "," + city + "," + state + "," + zip

    print("address save print",addy1, addy2, aptNum, city, state, zip)
    let key = ref.child("address").childByAutoId().key
    let setter = false
    let addyDict = ["address line 1":addy1,"address line 2":addy2,"apt Number":aptNum,"city":city,"state":state,"zip":zip,"keyID": key, "setter": setter] as [String : Any]
    let userID = Auth.auth().currentUser?.uid
    let childUpdates = ["/address/\(key)": addyDict]
    ref.child("users").child(userID!).updateChildValues(childUpdates)

}

【问题讨论】:

  • 你应该从整个原始视图控制器创建一个segue,而不是仅仅将按钮转到目标视图控制器。那么您可以随时触发 segue,而不是取消已经触发的 segue。

标签: ios swift textbox segue unwind-segue


【解决方案1】:

鉴于我没有看到您在 @IBAction 中执行 segue,我们必须假设您将按钮连接到 @IBAction 和 unwind segue。您应该从右侧面板上最后一个选项卡上按钮的“Connections Inspector”中删除转场,而是从视图控制器本身创建一个展开转场到出口插座:

然后您可以在左侧面板中选择该 segue,单击该 segue 的“属性检查器”,为其指定故事板标识符:

然后您可以使用该情节提要标识符以编程方式执行转场,仅在您剩余的@IBAction 中适用时,例如

@IBAction func didTapDoneButton(_ sender: Any) {
    // if the fields are `nil` or have a length of zero characters, show warning
    // and just `return` without ever performing unwind segue

    guard let firstName = textFieldFirstName.text?.trimmingCharacters(in: .whitespacesAndNewlines),
        let lastName = textFieldLastName.text?.trimmingCharacters(in: .whitespacesAndNewlines),
        firstName.count > 0, lastName.count > 0 else {
            let alert = UIAlertController(title: nil, message: "Please fill in all fields", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default))
            present(alert, animated: true)
            return
    }

    // do something with firstName and lastName

    save(firstName: firstName, lastName: lastName)

    // now perform unwind segue

    performSegue(withIdentifier: "unwindHome", sender: sender)
}

已经向您展示了这一点,我认为更可靠的方法是在输入必填字段之前不让用户点击“完成”/“保存”按钮。最重要的是,与其处理错误情况,不如设计一个不可能出现此类错误的 UI。

因此,其中的一些关键方面包括:

  • 调暗/禁用“完成”/“保存”按钮;
  • 为文本字段设置“占位符文本”以指示该字段是必需的。例如。 “名字(必需)”的占位符,以便用户知道它是必需的。
  • 为各种文本字段添加editingChanged方法,以适当地启用/禁用“完成”按钮:

    @IBAction func editingChanged(_ sender: UITextField) {
        if let firstName = textFieldFirstName.text?.trimmingCharacters(in: .whitespacesAndNewlines),
            let lastName = textFieldLastName.text?.trimmingCharacters(in: .whitespacesAndNewlines),
            firstName.count > 0, lastName.count > 0 {
            doneButton.isEnabled = true
        } else {
            doneButton.isEnabled = false
        }
    }
    

    显然将其与所有相关文本字段的“editingChanged”操作挂钩。

这会产生一个“完成”按钮(此演示右上角的那个),在所有文本字段中至少有一些文本之前,该按钮将被禁用:

底线,而不是处理错误,首先防止它。

【讨论】:

  • 除了命名 segue 标识符的部分外,我做了大部分你所解释的事情,因此我没有选择使用 performSegue(withIdentifier: "unwindHome", sender: sender) 行,谢谢!将实施,如果我遇到问题,我会回来寻求您的帮助。
  • FWIW,我添加了一种我认为更好的替代方法,即,与其处理错误,不如防止它发生。
  • 我喜欢 :) 你的电子邮件地址是什么?
  • 我宁愿不在公共论坛上发布我的电子邮件地址,但如果你去我的 S.O.个人资料,有一个指向我的网站的链接,上面有一个“电子邮件”链接,您可以在其中给我发送私人便条。
【解决方案2】:

您应该重写 shouldPerformSegue 方法,如果教科书字段为空,则返回 false。

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {

}

【讨论】:

  • 所以总之我应该正确地删除 unwind segue 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多