【Swift】Alamofile网络请求数据更新TableView的坑详解手机开发

 

写这篇BLOG前,有些话不得不提一下,就仅当发发恼骚吧。。。

今天下午为了一个Alamofire取得数据而更新TableView的问题,查了一下午的百度(360也是见鬼的一样),竟然没有一个简单明了的回答,

而唯一几个比较接近答案的,说要 self.tableView.reloadData(),也没有贴上代码,说要放在哪个函数内,

都犹抱琵琶半遮面,让初学者自己采坑,于是郁闷了一下午,刚刚回到家,试想想,要不试试英文网,毕竟Swift就是人家老外的,

说不定老外会告诉你,怎么取得数据并绑定TableView,果不其然,用了不到3份钟的时候就完美解决。

写这篇BLOG,如果后面的新手有幸看到这篇,也可以少走很多弯路。。。

还有

特别感谢英文网

http://blog.revivalx.com/2015/02/23/uitableview-tutorial-in-swift-using-alamofire-haneke-and-swiftyjson/

 

有一点特别注意的是,方法 self.tableView.reloadData() 要在变量wifi改变的时候立马加入

直接看以下的代码了。。。

 

【Swift】Alamofile网络请求数据更新TableView的坑详解手机开发

 

// 
//  TableViewController.swift 
//  MyTableView-1387 
// 
//  Created by apiapia on 17/1/6. 
//  Copyright © 2017年 apiapia. All rights reserved. 
//$ curl http://httpbin.org/get 
// 
//{ 
//    "args": {}, 
//    "headers": { 
//        "Accept": "*/*", 
//        "Connection": "close", 
//        "Content-Length": "", 
//        "Content-Type": "", 
//        "Host": "httpbin.org", 
//        "User-Agent": "curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3" 
//    }, 
//    "origin": "24.127.96.129", 
//    "url": "http://httpbin.org/get" 
//} 
 
// 
 
import UIKit 
import Alamofire 
import SwiftyJSON 
 
 
class TableViewController: UITableViewController { 
 
    var  wifi = ["StarBuck","MJ"] 
    // var wifi = [String]() 
     let url = "https://httpbin.org/get" 
    //上面wifi可以用 Alamofire获取远程数据, 
    //http://httpbin.org/get 
     
 
     
     
    override func viewDidLoad() { 
        super.viewDidLoad() 
    
         
         
      //  Alamofire取得的网络数据是异步的 
        Alamofire.request(url, method: .get).validate().responseJSON { (response) in 
          //  print (response.request) 
            switch response.result.isSuccess { 
            case true: 
                 
                if let value =  response.result.value  { 
                    let json = JSON(value) 
                    
                   let headers:Dictionary<String,Any>=json["headers"].dictionaryValue 
                     
                    print (headers) 
                   // populating tableview with json from url using Alamofire 
                   //  http://blog.revivalx.com/2015/02/23/uitableview-tutorial-in-swift-using-alamofire-haneke-and-swiftyjson/ 
//                    self.wifi = ["1","2","3","4"] 
//                    self.tableView.reloadData() 
                     
                   self.wifi = [String]() // 重新生成数组成功 
                  //  ["Accept-Language", "Host", "Accept", "User-Agent", "Accept-Encoding"] 
                    for (index,_) in headers{ 
                         
                        print (index) 
                        self.wifi.append(index) 
                         
                    } 
 
                    self.tableView.reloadData() 
                     
                } 
              
            case false: 
                print ("网络请求失败") 
                 
            } 
        } 
        
        print ("wifi现在是:",wifi) 
         
//        Alamofire.request(url).validate().responseJSON { response in 
//            switch response.result.isSuccess { 
//            case true: 
//                if let value = response.result.value { 
//                    let json = JSON(value) 
//                    if let number = json[0]["phones"][0]["number"].string { 
//                        // 找到电话号码 
//                        print("第一个联系人的第一个电话号码:",number) 
//                    } 
//                } 
//            case false: 
//                print("") 
//            } 
//        } 
//         
        
        //注册表格 
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "wifiCell") 
        //去掉表格尾部空行 
        self.tableView.tableFooterView = UIView(frame: CGRect.zero) 
         
        self.tableView.reloadData() 
         
         
 } 
 
   
 
    // MARK: - Table view data source 
 
    override func numberOfSections(in tableView: UITableView) -> Int { 
        // #warning Incomplete implementation, return the number of sections 
        return 3 //共有三个分区  
    } 
 
    //返回三个分区相应的表格行数 
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
        // #warning Incomplete implementation, return the number of rows 
          if section == 1 { 
             
             return self.wifi.count 
             
           } 
          else{ 
            return 1 
             
          } 
         
        } 
 
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
         
        if indexPath.section == 1 { 
            let cell = tableView.dequeueReusableCell(withIdentifier: "wifiCell", for: indexPath) 
            cell.textLabel?.text = self.wifi[indexPath.row] 
             
            return cell 
        }else{ 
            return super.tableView(tableView, cellForRowAt: indexPath) 
        } 
         
        
         
    } 
     
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
         
        if indexPath.section == 1 { 
             
            return 50 
             
        }else { 
            return super.tableView(tableView, heightForRowAt: indexPath) 
        } 
    } 
     
    //取消高亮直选 
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
         
        tableView.deselectRow(at: indexPath, animated: true) 
    } 
  
    // 当 override了一个静态表格的时候要用到 indentationLevelForRowAt这个方法  
    // 因为 数据源 对新加进来的 cell一无所知 ,所以要用这个代理方法 
    override func tableView(_ tableView: UITableView, indentationLevelForRowAt indexPath: IndexPath) -> Int { 
         
        if indexPath.section == 1 { 
             
            let newIndexPath = IndexPath(row: 0, section: indexPath.section) 
            return super.tableView(tableView, indentationLevelForRowAt:  newIndexPath) 
             
             
             
        }else { 
             
            return super.tableView(tableView, indentationLevelForRowAt: indexPath) 
        } 
    } 
 
    override func didReceiveMemoryWarning() { 
        super.didReceiveMemoryWarning() 
        // Dispose of any resources that can be recreated. 
    } 
     
     
     
     
     
     
     
    /* 
    // Override to support conditional editing of the table view. 
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
        // Return false if you do not want the specified item to be editable. 
        return true 
    } 
    */ 
 
    /* 
    // Override to support editing the table view. 
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
        if editingStyle == .delete { 
            // Delete the row from the data source 
            tableView.deleteRows(at: [indexPath], with: .fade) 
        } else if editingStyle == .insert { 
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
        }     
    } 
    */ 
 
    /* 
    // Override to support rearranging the table view. 
    override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { 
 
    } 
    */ 
 
    /* 
    // Override to support conditional rearranging of the table view. 
    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { 
        // Return false if you do not want the item to be re-orderable. 
        return true 
    } 
    */ 
 
    /* 
    // MARK: - Navigation 
 
    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
        // Get the new view controller using segue.destinationViewController. 
        // Pass the selected object to the new view controller. 
    } 
    */ 
 
} 

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/5364.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论