gpt4 book ai didi

ios - 获取 JSON 数据并在 Xcode 的 tableview 中显示

转载 作者:行者123 更新时间:2023-11-30 11:06:17 34 4
gpt4 key购买 nike

我正在创建一个IOS程序来从url下载json数据并显示在ios的表格 View 中。我在登录页面 View Controller 中下载 JSON(每 10 秒)并将 JSON 数据解析到 TableView Controller 时遇到问题。在发布此内容之前,我尝试多次搜索但找不到解决方案。下面是 StoryBoad 和代码

Story Board

  1. 用户将登录,登录成功后,将加载JSON数据(userlogin = true)。登录类loginPage中的以下代码:UIViewController

    @IBOutlet weak var usernameLogin: UITextField!

    @IBOutlet weak var passwordLogin: UITextField!

    @IBAction func loginPress(_ sender: Any) {

    username = usernameLogin.text!
    password = passwordLogin.text!
    let request = NSMutableURLRequest(url: NSURL(string: "http://talectric.com/wp-admin/a_p/users/userlogin.php")! as URL)
    request.httpMethod = "POST"
    let postString = "username=\(username)&password=\(password)"
    request.httpBody = postString.data(using: String.Encoding.utf8)
    let task = URLSession.shared.dataTask(with: request as URLRequest) {
    data, response, error in
    if error != nil {
    print("error=\(error!)")
    return
    }
    else
    {
    do {
    let respondString = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary
    print(respondString!)
    let message = respondString?["message"] as! String
    if message == "Check Pass" {
    userlogin = true
    DispatchQueue.main.async {
    let TabViewPageController = self.storyboard?.instantiateViewController(withIdentifier: "TabViewPageID") as! TabViewPage
    self.present(TabViewPageController, animated: true, completion: nil)
    }
    }
    else {
    DispatchQueue.main.async {
    let alertController = UIAlertController(title: "Login", message:
    "Username or Password is not correct", preferredStyle: UIAlertController.Style.alert)
    alertController.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default,handler: nil))
    self.present(alertController, animated: true, completion: nil)
    }
    }
    }
    catch let error as NSError {
    print(error.debugDescription)
    }
    }
    }
    task.resume()
    }
  2. 在 userlogin = true 后,@objc func taskdo() 会将 JSON 数据加载到nodeidArray,但第二次下载不会覆盖nodeidArray的第一个元素,并且nodeidArray会插入到最后一个元素之后(我只想覆盖nodeidArray)

    import UIKit

    var timer = Timer()

    var userlogin = false

    struct Data {}

    var username = String()

    var password = String()

    class loginPage: UIViewController{

    var nodeidArray = [String]()
    override func viewDidLoad() {
    super.viewDidLoad()
    timerstart()
    }
    func timerstart()
    {
    timer = Timer.scheduledTimer(timeInterval: 5, target: self,selector: #selector(loginPage.taskdo),userInfo:nil,repeats: true)
    }
    @objc func taskdo()
    {
    if userlogin == true{
    let request = NSMutableURLRequest(url: NSURL(string: "http://talectric.com/wp-admin/a_p/iot/read_all.php")! as URL)
    request.httpMethod = "POST"
    let postString = "username=\(username)&password=\(password)&authen=wdwfesf9329140dsvfxkciospdkm"
    request.httpBody = postString.data(using: String.Encoding.utf8)
    let task = URLSession.shared.dataTask(with: request as URLRequest) {
    data, response, error in
    if error != nil {
    print("error=\(error!)")
    return
    }
    else
    {
    do {
    if let respondString = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
    if let nodedata = respondString.value(forKey: "nodedata") as? NSArray {
    for node in nodedata{
    if let nodeDict = node as? NSDictionary {
    if let nodeid = nodeDict.value(forKey: "nodeid"){
    self.nodeidArray.insert(nodeid as! String, at: 0)
    }
    }
    }
    }
    }
    // print(respondString!)
    //let message = respondString?["numberofnodeid"] as! Int
    //let nodedata = respondString!.value(forKey: "nodedata")//
    // let nodeid = (nodedata as AnyObject).value(forKey: "nodeid")
    // print(respondString!.value(forKey: "nodedata")!)
    print(self.nodeidArray)
    let defaults = UserDefaults.standard
    defaults.set(self.nodeidArray, forKey: "YourKey")
    }
    catch let error as NSError {
    print(error.debugDescription)
    }
    }
    }
    task.resume()
    }
    }
    }
  3. 在 LoginViewController 中下载 JSON 后,我无法将数据粘贴到 tableview Controller 。我尝试在 LoginPage 中将 nodeidArray 更改为 static,但无法在 @objc func taskdo() 中使用静态变量。我也尝试了 UserDefaults,但无法在 TableViewController (NodeDataPage) 中获取数据

我已经使用 NodeDataPage 类中的局部变量成功测试了 TableView ,但无法测试来自其他 View Controller 的变量

import UIKit

class NodeDataPage:
UIViewController,UITableViewDelegate,UITableViewDataSource {

//var nodeidname = ["nodeid1","nodeid2","nodeid3"]
var testArray : [String]() = UserDefaults.standard.objectForKey("YourKey") {
var nodeidname : [NSString] = testArray! as! [NSString]
println(readArray)
}
@IBOutlet weak var tableView: UITableView!
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return nodeidname.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier:"nodeCell",for: indexPath)
cell.textLabel?.text = nodeidname[indexPath.row]
return cell
}}

我指定问题:

  1. 如何将 JSON 数据(在 LoginPage VC 中下载)传输到 Table View VC (NodeDataPage VC)?
  2. 如何在 LoginPage VC 中每 10 秒运行一次 JSON 下载函数(我尝试使用静态变量进入其他 View ,但无法在 @objc func taskdo() 中运行?
  3. 我想在用户登录后每 10 秒运行一次 JSON 下载数据。我应该将此函数放在 LoginPage VC 或其他 View 中,因为我需要连续从服务器获取数据吗?
  4. 当应用程序隐藏(不被杀死)时,如何运行 JSON 下载函数?

我曾尝试研究一小部分,但现在它变得更加复杂。请帮助我。

谢谢

最佳答案

创建一个单独的类,例如“DataManager”,它保存所有数据 (nodeidArray),并每 10 秒调用服务器从 Web 服务获取数据。

用户成功登录后,显示 NodeDataPage。在此类的viewDidLoad中,创建DataManager对象并调用处理计时器和从服务器获取数据的方法。

使用通知或观察者设计模式通知 NodeDataPage 从 DataManager 获取数据并重新加载 tableview。

希望我能够回答您的问题。

关于ios - 获取 JSON 数据并在 Xcode 的 tableview 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52681906/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com