同一/不同StoryBoard(故事板)下的ViewController(界面)跳转及传值

先贴出代码,然后来分析
MainViewController.swift

import UIKit;
import SwiftyJSON;//json序列化
import Alamofire;//http网络请求
import Toast_Swift;//Toast

class ViewController: UIViewController {
    @IBOutlet weak var etAccount: UITextField!;
    @IBOutlet weak var etPassword: UITextField!;
    @IBOutlet weak var btnLogin: UIButton!;
    
    override func viewDidLoad() {
        super.viewDidLoad();
        initView();
    }
    
    func initView(){
        etAccount.frame = CGRect.init(x: 57, y: 496, width: 300, height: 40);//重新设置view的位置及大小
        etPassword.frame = CGRect.init(x: 57, y: 563, width: 300, height: 40);
        btnLogin.layer.cornerRadius = 8;//设置按钮j圆角
    }

    @IBAction func Login(_ sender: Any) {
        self.view.makeToastActivity(.center)//显示加载框
        AF.request("https://www.easy-mock.com/mock/5ca311a6be558a4c9a78ba52/res/Android/login" ,method: .post).responseJSON{response in
            DispatchQueue.main.async {//回到UI线程
                self.view.hideToastActivity();//隐藏加载框
                switch response.result {
                case .success(let value)://返回数据成功
                    
                    let json = JSON(value);//json序列化
                    if json["response"]["res"].boolValue {
                        print("userID:\(json["response"]["data"]["userID"].stringValue)");
                        print("userName:\(json["response"]["data"]["userName"].stringValue)");
                        print("userPhone:\(json["response"]["data"]["userPhone"].stringValue)");
                        
                        /**
                         不同StoryBoard之间的ViewController的跳转及传值
                         */
                        let sb = UIStoryboard.init(name:"HomeScreen",bundle:Bundle.main);//实例化StoryBoard
                        let viewCro = sb.instantiateViewController(withIdentifier: "home") as! Home; //实例化ViewController,类型强转为Home类型,及目标ViewController,便于后面的界面之间的传值
                        viewCro.data = json["response"]["data"]["userID"].stringValue;//调用Home类中的data进行赋值,赋值需要在self.present之间,否则在下一个界面的取值为nil
                        self.present(viewCro, animated: true, completion: nil);//界面跳转实际函数
                        
                        /**
                         相同StoryBoard下的ViewController的跳转及传值
                         */
//                        let viewcontroller = Home();
//                        viewcontroller.data = "value";//赋值需要在self.present之间,否则在下一个界面的取值为nil
//                        self.present(viewcontroller, animated: true, completion: nil);
                        
                        
                    } else {
                        self.view.makeToast(json["response"]["exception"].stringValue)//弹出登录失败的消息
                    }
                case .failure(let error)://返回数据失败
                    self.view.makeToast("错误代码:\(error)");//显示f错误消息
                }
            }

        }
        
    }
    
}

Home.swift

import UIKit

class Home: UIViewController {
    var data:String?;
    override func viewDidLoad() {
        super.viewDidLoad();
        print(self.data!);
    }
}

我们需要从MainViewController界面跳转到Home界面
刚学IOS开发3天,只能按照我的理解来分析了,各位看看就好
因为这个demo单纯为测试界面跳转,所有没有对etaccount和etpassword中的内容做验证,后期会加上验证,http的body也会加上json。
先简单说一下流程,单击按钮,调用Login方法,显示loading加载框,发送POST请求,然后回到UI线程进行UI操作(IOS和Android一样,不允许在UI线程进行耗时操作),首先隐藏loading加载框,然后判断返回的结果是否成功,如果返回不成功,会Toast显示错误代码,如果返回成功,则对response进行json序列化,然后开始进行界面的跳转,
分两种情况
1.两个ViewController在用一个StoryBoard下,可以直接实例化目标ViewController,然后调用目标的var变量进行赋值(感觉不算真正意义上的传值,有点像赋值,目前能力有限)
2.两个ViewController不在同一个StoryBoard下,需要先初始化目标ViewController所在的StoryBoard,然后再根据目标StoryBoard来实例化ViewController,但是此时不能直接调用viewCro进行赋值,因为当前的类型推断并不能直接推出其类型为Home(目标ViewController),所以要通过 as!Home来强转为目标ViewController

猜你喜欢

转载自blog.csdn.net/qq_17282141/article/details/97394358