有条不紊地使用shouldPerformSegue调用unwind segue

时间:2017-09-21 04:13:08

标签: ios arrays validation swift3 unwind-segue

我有两个视图控制器:Step3VC(我们称之为'A')和Step3AddJobVC(我们称之为'B')。我正在尝试验证'B'上的一些数据,然后再将'unwind segue'恢复为'A'。

'B'需要一些用户输入,我想验证用户输入是否重复。用户正在制作一个杂务列表,因此重复的名称将不起作用。当用户点击“保存”时,展开segue执行,数据被添加到数组中。

问题在于:数组在'A'上,但验证需要在'A'被调用之前发生在'B'上。我该怎么做?

我尝试了什么:

我尝试在'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'验证码,则展开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
        }
    }

我错过了什么?有一个更好的方法吗?在调用/执行展开segue之前,当我在'B'中执行我的验证时,如何从'A'调用变量?

1 个答案:

答案 0 :(得分:0)

您正在尝试验证shouldPerformSegue中哪些是正确的位置,您正在做错的是重新创建Step3VC的新对象并尝试访问从未设置为value的dailyJobs。

let newVC = Step3VC()
print(newVC.dailyJobs) 

你所做的是在呈现VC B的同时将dailyJobs从VC A传递给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
  }

}