【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改變的時候立馬加入

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

 

 

//
//  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.
    }
    */

}



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM