先贴出代码,然后来分析
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