Swift
1.導(dǎo)入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添加擴(kuò)展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)
?//延時(shí)執(zhí)行隱藏操作 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("點(diǎn)擊查詢", 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 }?
?//實(shí)例化結(jié)果控制器 let resultVC = RecioeResultViewController()
?//傳遞數(shù)據(jù) resultVC.passString = (recipeTF?.text)!?
?//控制器跳轉(zhuǎn) self.navigationController?.pushViewController(resultVC, animated: true) }?
?// MARK: - -------delegate---- func textFieldShouldReturn(_ textField: UITextField) -> Bool {
?//放棄第一響應(yīng) textField.resignFirstResponder() return true }
?//MARK: - -------touchesBegan-------- override func touchesBegan(_ touches: Set, with event: UIEvent?) {
? ? ? ? super.touchesBegan(touches, with: event)
? ? ? ? self.view.endEditing(true)
? ? }
}
3.傳遞數(shù)據(jù)的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)\"的搜索結(jié)果,"
? ? ? ? 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)判斷有無網(wǎng)絡(luò)
? ? ? ? if Reachability.forLocalWiFi().currentReachabilityStatus() == NotReachable && Reachability.forInternetConnection().currentReachabilityStatus() == NotReachable{
? ? ? ? ? ? vc.showAlert(msg: "網(wǎng)絡(luò)錯(cuò)誤,請檢查網(wǎng)絡(luò)", sec: 3.0)
? ? ? ? ? ? compltion("error",false)
? ? ? ? ? ? return
? ? ? ? }
? ? ? ? //(2)狀態(tài)欄中的菊花開始轉(zhuǎn)動
? ? ? ? UIApplication.shared.isNetworkActivityIndicatorVisible = true
? ? ? ? ? //(3)網(wǎng)址字符串封裝
? ? ? ? let url = URL.init(string: "http://api.jisuapi.com/recipe/search")
? ? ? ? //(4)創(chuàng)建請求對象
? ? ? ? var req = URLRequest(url: url!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 15.0)
? ? ? ? //()使用Post請求網(wǎng)絡(luò)數(shù)據(jù)
? ? ? ? req.httpMethod = "POST"
? ? ? ? // 將所有的參數(shù)拼接成一個(gè)字符串
? ? ? ? let str = "keyword=\(search)&num=10&appkey=de394933e1a3e2db"
? ? ? ? //設(shè)置請求對象的請求體
? ? ? ? req.httpBody = str.data(using: .utf8)
? ? ? ? //(5)會話對象請求服務(wù)器數(shù)據(jù)
? ? ? ? URLSession.shared.dataTask(with: req) { (data, response, error) in
? ? ? ? //停止菊花
? ? ? ? ? ? DispatchQueue.main.async {
? ? ? ? ? ? ? ? UIApplication.shared.isNetworkActivityIndicatorVisible = false
? ? ? ? ? ? }
? ? ? ? ? ? //如果服務(wù)器連接失敗
? ? ? ? ? ? if error != nil{
? ? ? ? ? ? ? ? DispatchQueue.main.async {
? ? ? ? ? ? ? ? ? ? vc.showAlert(msg: "服務(wù)器超時(shí)", sec: 2.6)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? ? ? //json解析
? ? ? ? ? ? let jsonData = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments)
? ? ? ? ? ? if jsonData == nil{
? ? ? ? ? ? ? ? DispatchQueue.main.async {
? ? ? ? ? ? ? ? ? ? vc.showAlert(msg: "網(wǎng)絡(luò)數(shù)據(jù)錯(cuò)誤", sec: 3.3)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? ? ? //如果正確,將Json數(shù)據(jù)返回給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
? ? ? ? ? ? }
? ? ? ? ? ? //得到j(luò)son數(shù)據(jù)中result字段對應(yīng)的字典
? ? ? ? ? ? let resultDic = jsonDic.value(forKey: "result")as! NSDictionary
? ? ? ? ? ? //得到result字典中的list數(shù)組
? ? ? ? ? ? let listArr = resultDic.value(forKey: "list")as! NSArray
? ? ? ? ? ? //Model封裝
? ? ? ? ? ? var modelArr:[Recipe] = []
? ? ? ? ? ? //遍歷數(shù)組中的每個(gè)字典
? ? ? ? ? ? for item in listArr{
? ? ? ? ? ? ? ? let itemDic = item as! NSDictionary
? ? ? ? ? ? ? ? //實(shí)例化一個(gè)
? ? ? ? ? ? ? ? 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?