在 Swift 中使用 shouldPerformSegue() 检查字段后如何继续使用 segue

Posted

技术标签:

【中文标题】在 Swift 中使用 shouldPerformSegue() 检查字段后如何继续使用 segue【英文标题】:How to continue with segue after checking fields with shouldPerformSegue() in Swift 【发布时间】:2016-12-21 06:50:22 【问题描述】:

使用shouldPerforSegue() func,我可以在转场之前检查一些字段,但是,即使在触发转场时字段不好,我也需要它继续转场。

现在,当用户单击触发 segue 的按钮时,我正在检查图像是否已上传到服务器。我显示一个进度条和一个警报以指示剩余百分比。但是,现在图像上传到服务器后,进度条显示为 100%。我仍然必须手动单击“确定”并重新单击 seguing 按钮。我想看看是否有办法绕过这个障碍,只需要继续 segue。

我已尝试在图片上传后以编程方式触发 segue 按钮,但它没有按预期工作。

UIApplication.shared.sendAction(self.saveButton.action!, to: self.saveButton.target, from: nil, for: nil)

我有检查验证的功能:

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool 
        if ((sender as? UIBarButtonItem) != nil) && uploadingImagesToFirebase  
            // Create the alert controller
            let alertController = UIAlertController(title: "Uploading Images...", message: "", preferredStyle: .alert)
            // Create an ok button
            let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default)  (result : UIAlertAction) -> Void in
                print("OK")
            
            alertController.addAction(okAction)

            self.present(alertController, animated: true, completion: 
                //  Add your progressbar after alert is shown (and measured)
                let rect = CGRect(x: alertController.view.frame.width * 0.10, y: alertController.view.frame.height / 2, width: alertController.view.frame.width * 0.80, height: 100)
                self.progressView = UIProgressView(frame: rect)
                alertController.view.addSubview(self.progressView!)
            )

            return false
        
        return true
    
override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        // If user clicks on a job cell
        if segue.identifier == "showJobDetails" 
            ...
        
        else if addJobButton == sender as? UIButton 
            print("Adding a new job from customer view")
            ...
        
        // If save button was choice selected by user
        else if segue.identifier == "identifier 
            customer.firstName = firstNameTextField.text
            customer.middleName = middleNameTextField.text
            customer.lastName = lastNameTextField.text
            customer.address = addressTextField.text
            customer.email = emailTextField.text
            customer.phone = phoneTextField.text

            customer.jobs = customerJobs

            updateCustomerValuesInFirebase()
            updateJobValuesInFirebase()
        
    

【问题讨论】:

【参考方案1】:

在检查之前(使用shouldPerformSegue(withIdentifier:sender:)),你应该先执行它,你可以使用performSegueWithIdentifier:sender:来实现:

使用当前指定的标识符启动 segue 查看控制器的故事板文件。

实际上,shouldPerformSegue(withIdentifier:sender:) 方法做了以下事情:

确定具有指定标识符的segue是否应该是 执行。

所以你应该这样做:

performSegue(withIdentifier: "identifier", sender: self)

使用shouldPerformSegue(withIdentifier:sender:)检查之前。

如果您不知道如何设置segue 的标识符,请查看this answer。

【讨论】:

performSegue()成为第一步,执行后由shouldPerformSegue ()进行检查。此外,performSegue() 是 'present' 或 'push' 的替代品。 如果转场是退出转场,我该怎么做? 不明白,exit segue 是什么意思? 我的意思是按钮展开到前一个控制器,没有“标识符”特征 应该没问题。顺便说一句,你确定你不需要解散/弹出来代替 unwind segue 吗?【参考方案2】:

在 Swift3 中,你必须通过这行代码来执行 segue:

performSegue(withIdentifier: identifier, sender: sender)

identifiersender 值取决于您调用 performSegue 的位置,例如,如果您在 shouldPerformSegue 函数中,则可以使用函数输入值,但如果您在其他函数中,则您有自己添加标识符(您为故事板中的 segue 设置它)并将发件人设置为 nil。

【讨论】:

以上是关于在 Swift 中使用 shouldPerformSegue() 检查字段后如何继续使用 segue的主要内容,如果未能解决你的问题,请参考以下文章

如何在OC中使用Swift如何在Swift中使用OC

swift 优雅地处理Swift中可本地化的字符串。注意:此代码在Swift 2中,需要在现代Swift中使用更新。

在 Swift 项目中使用 Objective C 类中的 Swift 类

在 Swift 项目中使用 Objective C 类中的 Swift 类

如何在 Swift 中使用 Apple 地图 - 你必须使用 C 还是 Swift 可以?

swift 在swift中使用javascriptcore