ios - 将 JSON Tableview 信息解析为单独的字符串

标签 ios json swift string uitableview

我目前正在尝试使用已填充 JSON 的 Tableview 单元格中的信息来执行各种操作,但由于它不在单独的字符串中,所以我无法调用特定信息。有没有什么方法可以将我拉入每个表格 View 单元格的数据组并将其转换为一系列单独的字符串?这是我目前拥有的:

import UIKit
import GoogleMobileAds

class OngoingViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var userUsernameLabel: UILabel!
    @IBOutlet weak var bannerView: GADBannerView!

    @IBOutlet weak var ongoingTable: UITableView!

    var list:[MyStruct] = [MyStruct]()

    struct MyStruct
    {
        var user1 = ""
        var user2 = ""
        var wager = ""
        var amount = ""

        init(_ user1:String, _ user2:String, _ wager:String, _ amount:String)
        {
            self.user1 = user1
            self.user2 = user2
            self.wager = wager
            self.amount = amount
        }
    }

    override func viewDidLoad() {

        super.viewDidLoad()

        let username = UserDefaults.standard.string(forKey: "userUsername")!
        userUsernameLabel.text = username


        /// The banner view.
        print("Google Mobile Ads SDK version: " + GADRequest.sdkVersion())
        bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"
        bannerView.rootViewController = self
        bannerView.load(GADRequest())


        ongoingTable.dataSource = self
        ongoingTable.delegate = self

        get_data("http://cgi.soic.indiana.edu/~team10/ongoingWagers.php")
    }


    func get_data(_ link:String)
    {
        let url:URL = URL(string: link)!


        var request = URLRequest(url:url);
        request.httpMethod = "POST";


        let postString = "a=\(userUsernameLabel.text!)";


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


        let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in



            self.extract_data(data)

        }

        task.resume()
    }


    func extract_data(_ data:Data?)
    {
        let json:Any?

        if(data == nil)
        {
            return
        }

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

        guard let data_array = json as? NSArray else
        {
            return
        }


        for i in 0 ..< data_array.count
        {
            if let data_object = data_array[i] as? NSDictionary
            {
                if let data_user1 = data_object["id"] as? String,
                    let data_user2 = data_object["id2"] as? String,
                    let data_wager = data_object["wager"] as? String,
                    let data_amount = data_object["amount"] as? String
                {
                    list.append(MyStruct(data_user1, data_user2, data_wager, data_amount))
                }

            }
        }


        refresh_now()


    }

    func refresh_now()
    {
        DispatchQueue.main.async(
            execute:
            {
                self.ongoingTable.reloadData()

        })
    }

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

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {

        return list.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = self.ongoingTable.dequeueReusableCell(withIdentifier: "owcell", for: indexPath) as! OngoingTableViewCell

        cell.infoLabel.text = list[indexPath.row].user1 + " " +  list[indexPath.row].user2 + " " + list[indexPath.row].wager + " " + list[indexPath.row].amount

        cell.user1Button.tag = indexPath.row
        cell.user1Button.addTarget(self, action: #selector(OngoingViewController.user1Action), for: .touchUpInside)

        cell.user2Button.tag = indexPath.row
        cell.user2Button.addTarget(self, action: #selector(OngoingViewController.user2Action), for: .touchUpInside)

        return cell

    }


    @IBAction func user1Action(sender: UIButton) {

        let user1Alert = UIAlertController(title: "Wait a second!", message: "Are you sure this user has won this wager?", preferredStyle: UIAlertControllerStyle.alert)
        user1Alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: { action in

            let user1ConfirmationAlert = UIAlertController(title: "Great!", message: "Please wait for the other user to confirm the winner of this wager.", preferredStyle: UIAlertControllerStyle.alert)
            user1ConfirmationAlert.addAction(UIAlertAction(title: "Got It!", style: UIAlertActionStyle.default, handler: nil))
            self.present(user1ConfirmationAlert, animated: true, completion: nil)

        }))
        user1Alert.addAction(UIAlertAction(title: "No", style: UIAlertActionStyle.default, handler: nil))
        self.present(user1Alert, animated: true, completion: nil)

    }

    @IBAction func user2Action(sender: UIButton) {

        let user2Alert = UIAlertController(title: "Wait a second!", message: "Are you sure this user has won this wager?", preferredStyle: UIAlertControllerStyle.alert)
        user2Alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: { action in

            let user2ConfirmationAlert = UIAlertController(title: "Great!", message: "Please wait for the other user to confirm the winner of this wager.", preferredStyle: UIAlertControllerStyle.alert)
            user2ConfirmationAlert.addAction(UIAlertAction(title: "Got It!", style: UIAlertActionStyle.default, handler: nil))
            self.present(user2ConfirmationAlert, animated: true, completion: nil)

        }))
        user2Alert.addAction(UIAlertAction(title: "No", style: UIAlertActionStyle.default, handler: nil))
        self.present(user2Alert, animated: true, completion: nil)

    }


}

这是 OngoingTableViewCell 子类:

import UIKit

class OngoingTableViewCell: UITableViewCell {

    @IBOutlet weak var infoLabel: UILabel!
    @IBOutlet weak var user1Button: UIButton!
    @IBOutlet weak var user2Button: UIButton!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

最佳答案

您有一个 MyStruct 结构数组,其中包含 user1、user1、betway 和 amount 的条目。这很好。

您在按钮上使用标签作为确定所选单元格的方式,这并不理想。相反,我建议使用 sender 参数来找出包含按钮的单元格的索引路径。有关更好方法的详细信息,请参阅我的答案的底部。

无论如何,一旦有了行号,您就可以通过索引数组轻松获取该赌注的数据:

@IBAction func user1Action(sender: UIButton) {

  selectedRow = sender.tag
  //or, using my function:
  selectedRow = tableView.indexPathForView(sender)

  //Get the wager for the button the user tapped on.
  let thisWager = list[selectedRow]
}

如果您希望在用户点击 UIAlertController 中的按钮后对赌注采取行动,请不要在第二个警报 Controller 上使用 nil 处理程序。相反,传入一个闭包,该闭包使用上面代码中的 selectedRow 参数来索引赌注列表,甚至使用我在代码中显示的 thisWager 局部变量。

<小时/>

获取用户点击按钮的indexPath:

<小时/>

我创建了一个简单的 UITableView 扩展,它允许您传入 UIView(如按钮操作中的发送者)并获取包含该 View 的 indexPath。

这个扩展非常简单。它的外观如下:

public extension UITableView {
  
  /**
  This method returns the indexPath of the cell that contains the specified view
   - Parameter view: The view to find.
   - Returns: The indexPath of the cell containing the view, or nil if it can't be found
  */
  
  func indexPathForView(_ view: UIView) -> IndexPath? {
    let origin = view.bounds.origin
    let viewOrigin = self.convert(origin, from: view)
    let indexPath = self.indexPathForRow(at: viewOrigin)
    return indexPath
  }
}

您可以从按钮的操作中调用该函数:

@IBAction func buttonTapped(_ button: UIButton) {
  if let indexPath = self.tableView.indexPathForView(button) {
    print("Button tapped at indexPath \(indexPath)")
  }
  else {
    print("Button indexPath not found")
  }
}

整个项目可以在 Github 上找到,链接为:TableViewExtension

关于ios - 将 JSON Tableview 信息解析为单独的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43460887/

相关文章:

ios - 找不到 lcrypto 的库

javascript - 如何搜索所有级别嵌套的 Javascript 对象

java - 无法解析方法 'fromJson(org.json.JSONObject, java.lang.Class<me.myrottentomatoes.Result[]>)'

ios - 从数据库获取图像后更新像元高度

ios - Xcode 下载 : "The certificate for this server is invalid"

javascript - jQuery 最接近 ('tr' ) 在 iOS 中不起作用

php - 在 Wordpress 主题中访问本地 JSON 文件

ios - 使用 Firebase 过滤搜索?

regex - 来自 URL 的 Youtube 视频 ID - Swift3

ios - 如何使用 TwilioXamarinBindings Twilio.Voice.iOS 接听来电