如何让 json 在 Swift 3 中填充 UITableView?

Posted

技术标签:

【中文标题】如何让 json 在 Swift 3 中填充 UITableView?【英文标题】:How to get json to populate UITableView in Swift 3? 【发布时间】:2017-02-03 03:50:36 【问题描述】:

我无法获取要显示的数据。我已经从 MCViewController 自定义类发布了我的代码。它不会建立。但是我确实在控制台中得到了数据响应。谁能指出我做错了什么?

class MCViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    let message_url = "https://www.testing.com/api/resources/get_film_message/film_id/3825"
    let send_url = "https://www.testing.com/api/resources/send_film_message"
    let film_id = "3825"
    var messageArray = [String]()
    weak var messageView : UITableView!

    func messageView(_ messageView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return messageArray.count
    
    func messageView(_ messageView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 


        let cell = messageView.dequeueReusableCell(withIdentifier: "msgContent", for:indexPath) as! MessageTableViewCell
        // Configuring Cell
        cell.msgContent.text = messageArray[indexPath.row]
        // Returning the cell
        return cell
    



    @IBOutlet weak var MessageInput: UITextField!
    @IBAction func Sendmsg(_ sender: Any) 
        Sendmsg(username:MessageInput.text!, password: film_id)
    

    override func viewDidLoad() 
        super.viewDidLoad()

        messageView.dataSource = self
        messageView.delegate = self
        // Do any additional setup after loading the view.
        //let post_data: NSDictionary = NSMutableDictionary()


        //        post_data.setValue(username, forKey: "username")
        //        post_data.setValue(password, forKey: "password")

        let url:URL = URL(string: message_url)!
        let session = URLSession.shared

        let request = NSMutableURLRequest(url: url)
        request.httpMethod = "GET"
        request.setValue("740c94c51891c02b64d6c78840b478fe0b02fe2c", forHTTPHeaderField: "X-API-KEY")
        request.setValue("Basic YmhlZW0uZW5nckBnbWFpbC5jb206YmgzM20=", forHTTPHeaderField: "Authorization")
        request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
        // Do any additional setup after loading the view.
        var paramString = ""


        //        for (key, value) in post_data
        //        
        //            paramString = paramString + (key as! String) + "=" + (value as! String) + "&"
        //        
        //
        request.httpBody = paramString.data(using: String.Encoding.utf8)

        let task = session.dataTask(with: request as URLRequest, completionHandler: 
            (
            data, response, error) in

            guard let _:Data = data, let _:URLResponse = response  , error == nil else 

                return
            



            let json: Any?

            do
            
                json = try JSONSerialization.jsonObject(with: data!, options: [])
                if let parsedData = json as? [[String:Any]] 
                    for dict in parsedData 
                        if let title = dict["message"] as? String 
                            self.messageArray.append(title)
                            print(json)
                        
                    
                
            
            catch
            
                return
            

            guard let server_response = json as? NSDictionary else
            
                return
            


            if let data_block = server_response["data"] as? NSDictionary
            
                if let session_data = data_block["session"] as? String
                
                    //  self.login_session = session_data

                    let preferences = UserDefaults.standard
                    preferences.set(session_data, forKey: "session")

                    //  DispatchQueue.main.async(execute: self.LoginDone)
                
            



        )

        task.resume()
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func Sendmsg(username:String, password:String)
    
        let post_data: NSDictionary = NSMutableDictionary()


        post_data.setValue(username, forKey: "message")
        post_data.setValue(password, forKey: "film_id")

        let url:URL = URL(string: send_url)!
        let session = URLSession.shared

        let request = NSMutableURLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue("740c94c51891c02b64d6c78840b478fe0b02fe2c", forHTTPHeaderField: "X-API-KEY")
        request.setValue("Basic YmhlZW0uZW5nckBnbWFpbC5jb206YmgzM20=", forHTTPHeaderField: "Authorization")
        request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

        var paramString = ""


        for (key, value) in post_data
        
            paramString = paramString + (key as! String) + "=" + (value as! String) + "&"
        

        request.httpBody = paramString.data(using: String.Encoding.utf8)

        let task = session.dataTask(with: request as URLRequest, completionHandler: 
            (
            data, response, error) in

            guard let _:Data = data, let _:URLResponse = response  , error == nil else 

                return
            



            let json: Any?

            do
            
                json = try JSONSerialization.jsonObject(with: data!, options: [])
                print(json)
            
            catch
            
                return
            

            guard let server_response = json as? NSDictionary else
            
                return
            


//            if let data_block = server_response["data"] as? NSDictionary
//            
//                if let session_data = data_block["session"] as? String
//                
//                    self.login_session = session_data
//                    
//                    let preferences = UserDefaults.standard
//                    preferences.set(session_data, forKey: "session")
//                    
//                    DispatchQueue.main.async(execute: self.LoginDone)
//                
//            
//            


        )

        task.resume()


    

【问题讨论】:

附加到messageArray后需要重新加载集合视图 获取数据后重新加载表格视图。 【参考方案1】:

viewDidLoad() 中,附加到 messageArray 的 do catch 调用 messageView.reloadData(),如下所示:

do

    json = try JSONSerialization.jsonObject(with: data!, options: [])
    if let parsedData = json as? [[String:Any]] 
        for dict in parsedData 
            if let title = dict["message"] as? String 
                self.messageArray.append(title)
                print(json)
            
        
    
    messageView.reloadData()  // this is your tableView reload 

catch

    return

通常人们会将他们的 UITableView 对象称为 tableView,以便更容易在代码中发现。不过,没有人禁止您使用 messageView 作为 tableView 的名称。

【讨论】:

以上是关于如何让 json 在 Swift 3 中填充 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 中用 JSON 数据填充表格?

从 Firebase 下载 json 并填充 TableView Swift 3

如何从 Swift 中每个 UI 测试断言的空核心数据开始?

如何在 Swift 2 中从 JSON 填充我的 tableView?

如何使用来自 Alamofire 的 JSON 数据填充 tableview?

从 Swift 中的 Json 响应中填充 TableSection