swift 使用 shouldPerformSegue 有条件地调用 unwind segue
swift conditionally call unwind segue using shouldPerformSegue
我有两个视图控制器:Step3VC(我们称之为 'A')和 Step3AddJobVC(我们称之为 'B')。我正在尝试验证 'B' 上的一些数据,然后再执行回退到 'A'。
'B' 需要一些用户输入,我想验证用户输入是否重复。用户正在制作一份杂务清单,因此重复的名称将不起作用。当用户点击 'save' 时,unwind segue 执行,并将数据添加到数组中。
这是问题所在:数组在 'A' 上,但验证需要在 'B' 上发生,然后才能调用 'A'。我该怎么做?
我试过的:
我试过在 'B' 中使用 shouldPerformSegue
,但数组返回空白 []
。所以这不好。这是来自 'B':
的代码
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
print("identifier is: ", (identifier))
print("sender is: ", (sender)!)
let newVC = Step3VC()
print(newVC.dailyJobs)
return false
}
然后我尝试在展开 segue 期间将验证放入 'A'...
@IBAction func unwindToStep3VC(sender: UIStoryboardSegue) {
let sourceVC = sender.source as! Step3AddJobVC
let updatedJob = sourceVC.job
// check for duplicate names
for name in dailyJobs {
print(name.name)
if name.name.lowercased() == (sourceVC.jobTextField.text?.lowercased()) { // check to see if lowercased text matches
print("error")
// call alert function from sourceVC
sourceVC.duplicateNameCheck()
return
}
}
if let selectedIndexPathSection = jobsTableView.indexPathForSelectedRow?.section { // if tableview cell was selected to begin with
// Update existing job
if selectedIndexPathSection == 0 {
let selectedIndexPathRow = jobsTableView.indexPathForSelectedRow
dailyJobs[(selectedIndexPathRow?.row)!] = updatedJob!
jobsTableView.reloadData()
} else if selectedIndexPathSection == 1 {
let selectedIndexPathRow = jobsTableView.indexPathForSelectedRow
weeklyJobs[(selectedIndexPathRow?.row)!] = updatedJob!
jobsTableView.reloadData()
}
} else {
// Add a new daily job in the daily jobs array
let newIndexPath = IndexPath(row: dailyJobs.count, section: 0)
dailyJobs.append(updatedJob!)
jobsTableView.insertRows(at: [newIndexPath], with: .automatic)
}
}
...但它给出了错误:
popToViewController:transition: called on <ToDo_App.SetupNavController 0x7fcfd4072c00> while an existing transition or presentation is occurring; the navigation stack will not be updated.
如果我取出 'if' 验证码,unwind segue 会正常工作。数据被传输并做正确的事情。问题是如果用户输入重复条目,我不知道如何阻止它们。
这是我检查用户输入是否重复的代码:
// check for duplicate names
for name in dailyJobs {
print(name.name)
if name.name.lowercased() == (sourceVC.jobTextField.text?.lowercased()) { // check to see if lowercased text matches
print("error")
// call alert function from sourceVC
sourceVC.duplicateNameCheck()
return
}
}
我错过了什么?有一个更好的方法吗?我如何在 'B' 中调用 'A' 中的变量以在调用/执行 unwind segue 之前执行我的验证?
您正在尝试验证 shouldPerformSegue 中的正确位置,您做错的是重新创建 Step3VC 的新对象并尝试访问从未设置值的 dailyJobs。
let newVC = Step3VC()
print(newVC.dailyJobs)
你要做的是将 dailyJobs 表单 VC A 传递给 VC B,同时呈现 VC B,然后在 shouldPerformSegue 中检查数据是否重复。
您的代码必须如下所示:
class VCA: UIViewController {
var dailyJobs = getDailyJobsFromServer()
@IBAction segueToVCB(sender: UIButton) {
let sb = UIStoryboard(name: "Main", bundle: nil)
let vcB = sb.instantiateViewController(withIdentifier: "VCB") as! VCB
vcB.dailyJobs = dailyJobs
self.present(vcB, animated: true, completion: nil)
}
}
class VCB: UIViewController {
var dailyJobs: //DataType
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
//Here you do comparision with dailyJobs
if dailyJobs == userInput {
}
return false
}
}
我有两个视图控制器:Step3VC(我们称之为 'A')和 Step3AddJobVC(我们称之为 'B')。我正在尝试验证 'B' 上的一些数据,然后再执行回退到 'A'。
'B' 需要一些用户输入,我想验证用户输入是否重复。用户正在制作一份杂务清单,因此重复的名称将不起作用。当用户点击 'save' 时,unwind segue 执行,并将数据添加到数组中。
这是问题所在:数组在 'A' 上,但验证需要在 'B' 上发生,然后才能调用 'A'。我该怎么做?
我试过的:
我试过在 'B' 中使用 shouldPerformSegue
,但数组返回空白 []
。所以这不好。这是来自 'B':
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
print("identifier is: ", (identifier))
print("sender is: ", (sender)!)
let newVC = Step3VC()
print(newVC.dailyJobs)
return false
}
然后我尝试在展开 segue 期间将验证放入 'A'...
@IBAction func unwindToStep3VC(sender: UIStoryboardSegue) {
let sourceVC = sender.source as! Step3AddJobVC
let updatedJob = sourceVC.job
// check for duplicate names
for name in dailyJobs {
print(name.name)
if name.name.lowercased() == (sourceVC.jobTextField.text?.lowercased()) { // check to see if lowercased text matches
print("error")
// call alert function from sourceVC
sourceVC.duplicateNameCheck()
return
}
}
if let selectedIndexPathSection = jobsTableView.indexPathForSelectedRow?.section { // if tableview cell was selected to begin with
// Update existing job
if selectedIndexPathSection == 0 {
let selectedIndexPathRow = jobsTableView.indexPathForSelectedRow
dailyJobs[(selectedIndexPathRow?.row)!] = updatedJob!
jobsTableView.reloadData()
} else if selectedIndexPathSection == 1 {
let selectedIndexPathRow = jobsTableView.indexPathForSelectedRow
weeklyJobs[(selectedIndexPathRow?.row)!] = updatedJob!
jobsTableView.reloadData()
}
} else {
// Add a new daily job in the daily jobs array
let newIndexPath = IndexPath(row: dailyJobs.count, section: 0)
dailyJobs.append(updatedJob!)
jobsTableView.insertRows(at: [newIndexPath], with: .automatic)
}
}
...但它给出了错误:
popToViewController:transition: called on <ToDo_App.SetupNavController 0x7fcfd4072c00> while an existing transition or presentation is occurring; the navigation stack will not be updated.
如果我取出 'if' 验证码,unwind segue 会正常工作。数据被传输并做正确的事情。问题是如果用户输入重复条目,我不知道如何阻止它们。
这是我检查用户输入是否重复的代码:
// check for duplicate names
for name in dailyJobs {
print(name.name)
if name.name.lowercased() == (sourceVC.jobTextField.text?.lowercased()) { // check to see if lowercased text matches
print("error")
// call alert function from sourceVC
sourceVC.duplicateNameCheck()
return
}
}
我错过了什么?有一个更好的方法吗?我如何在 'B' 中调用 'A' 中的变量以在调用/执行 unwind segue 之前执行我的验证?
您正在尝试验证 shouldPerformSegue 中的正确位置,您做错的是重新创建 Step3VC 的新对象并尝试访问从未设置值的 dailyJobs。
let newVC = Step3VC()
print(newVC.dailyJobs)
你要做的是将 dailyJobs 表单 VC A 传递给 VC B,同时呈现 VC B,然后在 shouldPerformSegue 中检查数据是否重复。
您的代码必须如下所示:
class VCA: UIViewController {
var dailyJobs = getDailyJobsFromServer()
@IBAction segueToVCB(sender: UIButton) {
let sb = UIStoryboard(name: "Main", bundle: nil)
let vcB = sb.instantiateViewController(withIdentifier: "VCB") as! VCB
vcB.dailyJobs = dailyJobs
self.present(vcB, animated: true, completion: nil)
}
}
class VCB: UIViewController {
var dailyJobs: //DataType
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
//Here you do comparision with dailyJobs
if dailyJobs == userInput {
}
return false
}
}