Segue 没有在 viewController 中执行

Posted

技术标签:

【中文标题】Segue 没有在 viewController 中执行【英文标题】:Segue not being executed in viewController 【发布时间】:2020-03-15 20:11:52 【问题描述】:

我正在开发我的第一个 ios 应用程序。

有一个 viewController 可以检查用户是否已经登录。

print("Usuario actual logeado:",logeado_actual ?? "ninguno")

        if (logeado_actual == "OK")
             print("logeado:")
            self.performSegue(withIdentifier: "sinlogear", sender: nil)
        

打印输出是

Usuario actual logeado: OK
logeado:

这意味着 segue 应该被执行,但它没有。

segue 存在且标识符为sinlogear

我的代码中是否有任何遗漏或无效的内容?

编辑

完整代码:

import Alamofire

import UIKit

 class ViewController: UIViewController 

    @IBOutlet weak var txtEmail: UITextField!
    @IBOutlet weak var txtPassword: UITextField!


    @IBOutlet weak var btnAcceder: UIButton!

    @IBOutlet weak var btnContinuar: UIButton!

    @IBOutlet weak var btnRegistro: UIButton!
    @IBOutlet weak var btnOlvidar: UIButton!
    //Defined a constant that holds the URL for our web service
    let URL_USER_REGISTER = "https://.../android_api/login.php"

    struct Usuario: Codable 
        var id: Int
        var activacion: Int
        var autorizado: Int
        var cif: String
        var correo: String
        var cuenta: String
        var direccion: String
        var empresa: String
        var facebook_id: String
        var foto_usuario: String
        var instagram_id: String
        var num_estrellas: Int
        var tel: String
        var token_firebase: String
        var twitter_id: String
        var usuario: String
        var nombre: String
    

    @IBOutlet weak var txtLabel: UILabel!
    @IBOutlet weak var labelMessage: UILabel!


    let defaults = UserDefaults.standard




    @IBAction func btnLogin(_ sender: Any) 
        print("login pulsado")

        //creating parameters for the post request
        let parameters: Parameters=[
            "email":txtEmail.text!,
            "password":txtPassword.text!
        ]

        print(txtEmail.text!)

         self.txtLabel.text = ""

        //Sending http post request
            Alamofire.request(URL_USER_REGISTER, method: .post, parameters: parameters).responseJSON
            
                response in
                //printing response
                print(response)

                //getting the json value from the server
                if let resultado = response.result.value 

                    //converting it as NSDictionary
                    let jsonData = resultado as! NSDictionary


                    let id = jsonData.value(forKey:"id") as! NSNumber?
                    let estado = jsonData.value(forKey: "error") as! NSNumber?

                    if estado == 0 
                    print("login:","OK")
                         self.txtLabel.text = "Datos correctos"
                        print("error:",estado!)
                                          print("id user:",id!)

                        if let json = response.result.value as? [String: Any] 
                            //usuario
                            do 
                                guard let user = json["user"] as? [String: Any],
                                      let usuario = user["usuario"] as? String
                                    else 

                                      print("Failed to parse JSON")
                                      return
                                

                                self.defaults.set(usuario, forKey: "usuario")
                                self.defaults.set("OK", forKey: "logeado")
                                print(usuario)

                        
                            //nombre
                                do 
                                    guard let user = json["user"] as? [String: Any],
                                          let nombre = user["nombre"] as? String
                                        else 

                                          print("Failed to parse JSON")
                                          return
                                    

                                    self.defaults.set(nombre, forKey: "nombre")

                                    print(nombre)

                            
                            //imageb
                                do 
                                    guard let user = json["user"] as? [String: Any],
                                          let foto_usuario = user["foto_usuario"] as? String
                                        else 

                                          print("Failed to parse JSON")
                                          return
                                    
                                    self.defaults.set(foto_usuario, forKey: "foto_usuario")

                                    print(foto_usuario)

                            
                            //correo
                           do 
                               guard let user = json["user"] as? [String: Any],
                                     let correo_usuario = user["correo"] as? String
                                   else 

                                     print("Failed to parse JSON")
                                     return
                               
                               self.defaults.set(correo_usuario, forKey: "correo")


                               print(correo_usuario)
                       

                        




                    
                    else 
                    print("login:","NO OK")

                        self.txtLabel.text = "Datos incorrectos"

                    




                
            

        

    override func viewDidLoad() 
        super.viewDidLoad()

            let usuario_actual = self.defaults.string(forKey: "usuario")
            let nombre_usuario_actual = self.defaults.string(forKey: "nombre")
            let foto_usuario_actual = self.defaults.string(forKey: "foto_usuario")
        let correo_usuario_actual = self.defaults.string(forKey: "correo")
        let logeado_actual = self.defaults.string(forKey: "logeado")

        print("Usuario actual:",usuario_actual ?? "ninguno")
        print("Usuario actual nombre:",nombre_usuario_actual ?? "ninguno")
        print("Usuario actual foto:",foto_usuario_actual ?? "ninguno")
         print("Usuario actual correo:",correo_usuario_actual ?? "ninguno")
        print("Usuario actual logeado:",logeado_actual ?? "ninguno")

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

        if (logeado_actual == "OK")
             print("logeado:")

        


        //redondear botones


        btnAcceder.layer.cornerRadius = 5
        btnAcceder.layer.borderWidth = 1
        btnAcceder.layer.borderColor = UIColor.white.cgColor

        btnOlvidar.layer.cornerRadius = 5
        btnOlvidar.layer.borderWidth = 1
        btnOlvidar.layer.borderColor = UIColor.white.cgColor

        btnRegistro.layer.cornerRadius = 5
        btnRegistro.layer.borderWidth = 1
        btnRegistro.layer.borderColor = UIColor.white.cgColor

        btnContinuar.layer.cornerRadius = 5
        btnContinuar.layer.borderWidth = 1
        btnContinuar.layer.borderColor = UIColor.white.cgColor
    


    

【问题讨论】:

【参考方案1】:

你应该稍微改变一下 performSegue。但首先。

1.) 移除当前segue(通过点击故事板中的连接并删除它)

2.) 拖动一个新的转场(就像你在创建当前转场时所做的那样)

3.) 添加相同的标识符

4.) 修复您的 performSegue,例如:

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

————

编辑:无法从viewDidLoad() 执行转场,因为它为时过早。此函数在情节提要出现之前运行。考虑使用viewDidAppear

override func viewDidAppear()
 //perform the segue here

【讨论】:

我已经实施了您提案中的所有要点,但没有成功。 @mvasco 您是否按照我的建议删除了它?然后又加了? 是的,我做到了。我会再试一次,然后我会关闭 XCode,然后再检查一次。 @mvasco 删除你的 if 语句并尝试运行 segue :) 我已将 segue 放在 if 语句之外,也不起作用。

以上是关于Segue 没有在 viewController 中执行的主要内容,如果未能解决你的问题,请参考以下文章

接收器 (<ViewController>) 没有带有标识符 '' 的 segue

单元测试:ViewController 没有带有标识符的 segue:“segue id”

Receiver (<ViewController>) 没有带有标识符的 segue

接收器 (<ViewController:>) 没有带有标识符“showAlerting”的segue

从侧面菜单 Segue 主 ViewController

通过 Segue 将数据传递给新的 ViewController