如何让 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?的主要内容,如果未能解决你的问题,请参考以下文章
从 Firebase 下载 json 并填充 TableView Swift 3
如何从 Swift 中每个 UI 测试断言的空核心数据开始?
如何在 Swift 2 中从 JSON 填充我的 tableView?