Swift
1.导入Reachability第三方(改成桥接)
2.info.plist文件
3 .AppDelegate.swift
let recipeVC = RecipeViewController()
recipeVC.navigationItem.title = "菜谱"
let nav = UINavigationController.init(rootViewController: recipeVC)
self.window?.rootViewController = nav
3.申明的RecipeUIViewController
let scrW = UIScreen.main.bounds.size.width
let scrH = UIScreen.main.bounds.size.height
//给UIController添加扩展extension UIViewController{
func showAlert(msg:String,sec:TimeInterval){
var alertVC = UIAlertController(title: nil, message: msg, preferredStyle: .alert)
//从vc控制器显示弹出提示控制器 self.present(alertVC, animated: true, completion: nil)
//延时执行隐藏操作 self.perform(#selector(hideAlertVC(sendle:)), with: alertVC, afterDelay: sec)}
@objc func hideAlertVC(sendle:UIAlertController) { sendle.dismiss(animated: true, completion: nil) }
}
class RecipeViewController: UIViewController,UITextFieldDelegate {
var recipeTF:UITextField?//菜谱输入框
var searchBtn:UIButton? override func viewDidLoad() { super.viewDidLoad()
self.view.backgroundColor = UIColor.white
// Do any additional setup after loading the view.
recipeTF = UITextField.init(frame: CGRect(x: 0, y: 0, width: 200, height: 50)) recipeTF?.center = CGPoint(x:scrW/2 , y: 200)
recipeTF?.borderStyle = .line recipeTF?.placeholder = "请输入查询的菜谱" recipeTF?.textColor = UIColor.blue
recipeTF?.textAlignment = .center
recipeTF?.clearButtonMode = .whileEditing recipeTF?.delegate = self self.view.addSubview(recipeTF!)
searchBtn = UIButton.init(frame: CGRect(x: 0, y: 0, width: 100, height: 50)) searchBtn?.center = CGPoint(x: scrW/2, y: 300)
searchBtn?.setTitle("点击查询", for: .normal)
searchBtn?.backgroundColor = UIColor.blue searchBtn?.setTitleColor(UIColor.yellow, for: .normal) searchBtn?.addTarget(self, action: #selector(btnDidPress(sendle:)), for: .touchUpInside) self.view.addSubview(searchBtn!) }
@objc func btnDidPress(sendle:UIButton) -> Void { if (recipeTF?.text?.isEmpty)!
{ self.showAlert(msg: "信息不可为空", sec: 2.0) return }
//实例化结果控制器 let resultVC = RecioeResultViewController()
//传递数据 resultVC.passString = (recipeTF?.text)!
//控制器跳转 self.navigationController?.pushViewController(resultVC, animated: true) }
// MARK: - -------delegate---- func textFieldShouldReturn(_ textField: UITextField) -> Bool {
//放弃第一响应 textField.resignFirstResponder() return true }
//MARK: - -------touchesBegan-------- override func touchesBegan(_ touches: Set, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
self.view.endEditing(true)
}
}
3.传递数据的RecioeResultUIvieweController
class RecioeResultViewController: UIViewController,UITableViewDataSource {
var passString:String = ""
var table:UITableView?
var tableData:[Recipe]?
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white
// Do any additional setup after loading the view.
self.navigationItem.title = "\"\(passString)\"的搜索结果,"
table = UITableView(frame: CGRect.init(x: 0, y: 0, width: scrW, height: scrH), style: .plain)
table?.dataSource = self
self.view.addSubview(table!)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let urlSer = URLService()
urlSer.seachRecipes(search: self.passString, vc: self) { (data, success) in
if !success{
return
}
self.tableData = data as? [Recipe]
DispatchQueue.main.async {
self.table?.reloadData()
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let count = self.tableData?.count{
return count
}
return 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let idient = "cell"
var cell = tableView.dequeueReusableCell(withIdentifier: idient)
if cell == nil{
cell = UITableViewCell.init(style: .subtitle, reuseIdentifier: idient)
}
let one = self.tableData![indexPath.row] as! Recipe
cell?.textLabel?.text = one.name
cell?.detailTextLabel?.text = one.content
return cell!
}
4.URLService继承NSObject
func seachRecipes(search:String,vc:UIViewController,compltion:@escaping (Any,Bool)->Void) {
//(1)判断有无网络
if Reachability.forLocalWiFi().currentReachabilityStatus() == NotReachable && Reachability.forInternetConnection().currentReachabilityStatus() == NotReachable{
vc.showAlert(msg: "网络错误,请检查网络", sec: 3.0)
compltion("error",false)
return
}
//(2)状态栏中的菊花开始转动
UIApplication.shared.isNetworkActivityIndicatorVisible = true
//(3)网址字符串封装
let url = URL.init(string: "http://api.jisuapi.com/recipe/search")
//(4)创建请求对象
var req = URLRequest(url: url!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 15.0)
//()使用Post请求网络数据
req.httpMethod = "POST"
// 将所有的参数拼接成一个字符串
let str = "keyword=\(search)&num=10&appkey=de394933e1a3e2db"
//设置请求对象的请求体
req.httpBody = str.data(using: .utf8)
//(5)会话对象请求服务器数据
URLSession.shared.dataTask(with: req) { (data, response, error) in
//停止菊花
DispatchQueue.main.async {
UIApplication.shared.isNetworkActivityIndicatorVisible = false
}
//如果服务器连接失败
if error != nil{
DispatchQueue.main.async {
vc.showAlert(msg: "服务器超时", sec: 2.6)
}
return
}
//json解析
let jsonData = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments)
if jsonData == nil{
DispatchQueue.main.async {
vc.showAlert(msg: "网络数据错误", sec: 3.3)
}
return
}
//如果正确,将Json数据返回给Controller
let jsonDic = jsonData as! NSDictionary
let status = jsonDic.value(forKey: "status")as! NSString
let msg = jsonDic.value(forKey: "msg")as! String
if status.intValue != 0{
DispatchQueue.main.async {
vc.showAlert(msg: msg, sec: 2.0)
}
return
}
//得到json数据中result字段对应的字典
let resultDic = jsonDic.value(forKey: "result")as! NSDictionary
//得到result字典中的list数组
let listArr = resultDic.value(forKey: "list")as! NSArray
//Model封装
var modelArr:[Recipe] = []
//遍历数组中的每个字典
for item in listArr{
let itemDic = item as! NSDictionary
//实例化一个
let one = Recipe()
one.name = itemDic.value(forKey: "name") as! String
one.id = itemDic.value(forKey: "id") as! String
one.content = itemDic.value(forKey: "content") as! String
modelArr.append(one)
}
print(jsonData)
compltion(modelArr,true)
}.resume()
}
}
5.Recipe继承NSobject
var id:String?
var classid:String?
var name:String?
var peoplenum:String?
var preparetime:String?
var content:String?