Ios 文本框值等于nil时取消解除序列
如果文本框值等于零,我想取消一个展开序列。 以下是当前代码。我使用脚本连接保存按钮(将文本值保存到数据库)。我在考虑使用poptorootviewcontroller,以确保在执行segue之前教科书具有价值。他们有没有办法用当前代码做到这一点 mainView中要放回的代码-Ios 文本框值等于nil时取消解除序列,ios,swift,textbox,segue,unwind-segue,Ios,Swift,Textbox,Segue,Unwind Segue,如果文本框值等于零,我想取消一个展开序列。 以下是当前代码。我使用脚本连接保存按钮(将文本值保存到数据库)。我在考虑使用poptorootviewcontroller,以确保在执行segue之前教科书具有价值。他们有没有办法用当前代码做到这一点 mainView中要放回的代码- @IBAction func unwind(_ segue: UIStoryboardSegue){ print("Back in TableView") } childView上的按钮执行展开序列- @I
@IBAction func unwind(_ segue: UIStoryboardSegue){
print("Back in TableView")
}
childView上的按钮执行展开序列-
@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)
}
如果教科书字段为空,则应重写shouldPerformSegue方法并返回false
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
}
如果教科书字段为空,则应重写shouldPerformSegue方法并返回false
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
}
鉴于我没有看到您在
@IBAction
中执行该序列,我们必须假设您将按钮连接到@IBAction
和展开序列。您应该从右侧面板上最后一个选项卡上的按钮“Connections Inspector”(连接检查器)中删除分段,而是创建一个从视图控制器本身到出口的展开分段:
然后,您可以在左侧面板中选择该序列,单击该序列的“属性检查器”,给它一个故事板标识符:
然后,只有在您剩余的@IBAction
中适当的情况下,您才可以使用该脚本标识符以编程方式执行segue,例如
@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
显然,这与所有相关文本字段的“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 } }
底线是,首先要防止错误的发生,而不是处理错误。鉴于我没有看到您在
@IBAction
中执行该序列,我们必须假设您将按钮连接到@IBAction
和展开序列。您应该从右侧面板上最后一个选项卡上的按钮“Connections Inspector”(连接检查器)中删除分段,而是创建一个从视图控制器本身到出口的展开分段:
然后,您可以在左侧面板中选择该序列,单击该序列的“属性检查器”,给它一个故事板标识符:
然后,只有在您剩余的@IBAction
中适当的情况下,您才可以使用该脚本标识符以编程方式执行segue,例如
@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
显然,这与所有相关文本字段的“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 } }
底线是,首先要防止错误的发生,而不是处理错误。您应该从整个原始视图控制器创建一个序列,而不仅仅是指向目标视图控制器的按钮。然后,您可以随时触发segue,而不是取消已触发的segue。您应该从整个原始视图控制器创建segue,而不仅仅是指向目标视图控制器的按钮。然后,您可以随时触发segue,而不是取消已触发的segue。因此,在结论中,我应该删除展开segue正确吗?因此,在结论中,我应该删除展开segue正确吗?除了命名segue标识符的部分外,我做了您所解释的大部分工作,因此我没有选择删除使用行performsgue(带有标识符:“unwindHome”,发件人:发件人)谢谢!将实施,如果我遇到问题,我会回来寻求你的帮助。FWIW,我添加了一种我认为更好的替代方法,即,与其处理错误,还不如阻止错误发生。我喜欢:)你的电子邮件地址是什么?我不想在公共论坛上发布我的电子邮件地址,但如果你转到我的S.O.个人资料,有一个链接到我的网站,上面有一个“电子邮件”链接,你可以在那里给我发一封私人便条。除了命名segue标识符的部分,你解释的大部分内容我都做了,因此我没有选择使用performsgue行(带有标识符:“unwindHome”,发件人:发件人)谢谢!将实施,如果我遇到问题,我会回来寻求您的帮助。FWIW,我添加了一种我认为更好的替代方法,即与其处理错误,还不如阻止错误发生。我喜欢:)您的电子邮件地址是什么?我不想发布我的电子邮件地址