ios - 如何将 TableViewCell 值传递给 Swift 3.0 中的新 ViewController?

标签 ios swift3 xcode8 uitableview

我有这个 JSON 数据

移动.json

{
    "status":"ok",
    "movement":
                [
                    {
                        "refno":"REF 1",
                        "dtfrom":"2017-13-12"
                    },
                    {
                        "refno":"REF 2",
                        "dtfrom":"2017-13-13"
                    },
                    {
                        "refno":"REF 3",
                        "dtfrom":"2017-13-14"
                    },
                ]
}

到目前为止,我设法将值提取到 TableViewCell 中。

但我的目标是将值从 ViewController.swift 传递到 MoveDetails.swift 以便该值可以显示在 MoveDetails.swift

我有这四个 swift 文件。我在 ViewController.swift 和 MoveDetails.swift 上遇到了问题。我不确定如何将值传递给新的 Controller 。

代码如下。

ViewController.swift

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var tableview: UITableView!
    var move: [Move]? = []
    override func viewDidLoad() {
        super.viewDidLoad()
        fetchData()
    }
    func fetchData() {
        let urlRequest = URLRequest(url: URL(string: "http://localhost/move.json")!)
        let task = URLSession.shared.dataTask(with: urlRequest) {
            (data,response,error)in
            if error != nil { return }

            self.move = [Move]()
            do {
                let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: AnyObject]

                if let msFromJson = json["movement"] as? [[String: AnyObject]] {
                    for mFromJson in msFromJson {
                        let ms = Move()
                        if let refno   = mFromJson["refno"] as? String, let dtfrom  = mFromJson["dtfrom"] as? String {
                            ms.refno        = refno
                            ms.dtfrom       = dtfrom
                        }
                        self.move?.append(ms)
                    }
                }
                DispatchQueue.main.async {
                    self.tableview.reloadData()
                }
            }
            catch let error{ print(error)}
        }
        task.resume()
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "movementstatusCell", for: indexPath) as! MoveCell

        cell.refnoLbl.text          = self.move?[indexPath.item].refno
        cell.dtfromLbl.text         = self.move?[indexPath.item].dtfrom
        return cell
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.move?.count ?? 0
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let vc = self.storyboard?.instantiateViewController(withIdentifier: "MoveDetails") as! MoveDetails

        let selectedMove = self.move?[indexPath.item]
         vc.refnoString = selectedMove.refno
        vc.dtfromString= selectedMove.dtfrom
        self.navigationController?.pushViewController(vc, animated: true)
    }
}

MoveCell.swift

import UIKit
class MoveCell: UITableViewCell {

    @IBOutlet weak var dtfromLbl: UILabel!
    @IBOutlet weak var refnoLbl: UILabel!    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

移动.swift (NSObject)

import UIKit
class Move: NSObject {
    var refno: String?
    var dtfrom: String?
}

MoveDetails.swift

import UIKit
class MoveDetails: UIViewController {

    @IBOutlet weak var refnoLbl: UILabel!
    @IBOutlet weak var dtfromLbl: UILabel!

    var refnoString: String!
    var dtfromString: String!

    override func viewDidLoad() { 
        super.viewDidLoad() 
        refnoString = refnoLbl.text
        dtfromString = dtfromLbl.text
    }
    override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }
}

感谢有人能提供帮助。谢谢。

最佳答案

您只需设置MoveDetails View Controller 的属性。作为建议

  • 不是在 MoveDetails 中存储 refnoStringdtfromString 属性,您可以只存储一个 Move 类型的属性:
  • 缓存 MoveDetails View Controller 以重用它
  • 实现 viewDidAppear 以更新 MoveDetails socket

所以:

class ViewController: UIViewController, UITableViewDelegate,    UITableViewDataSource {

    var detailsVC : MoveDetails?

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if (detailsVC == nil) {
            detailsVC = self.storyboard?.instantiateViewController(withIdentifier: "MoveDetails") as! MoveDetails
        }
        detailsVC.move = self.move?[indexPath.item]
        self.navigationController?.pushViewController(detailsVC , animated: true)
    }
}

然后,覆盖 MoveDetails View Controller 中的 viewDidAppear,然后您只需将值填入文本标 checkout 口即可。

class MoveDetails: UIViewController {

    @IBOutlet weak var refnoLbl: UILabel!
    @IBOutlet weak var dtfromLbl: UILabel!

    var move:Move?

    override func func viewDidAppear(_ animated: Bool) {
        refnoLbl.text = move?.refno
        dtfromLbl.text = move?.dtfrom
    }
}

语法错误是因为我目前没有可用的 Xcode 来进行检查

关于ios - 如何将 TableViewCell 值传递给 Swift 3.0 中的新 ViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42220443/

相关文章:

ios - UITableView 未填满屏幕底部

ios - 是否可以使用游戏中心实现评级系统?

iphone - Twitter API(从 ID 到屏幕名称)

ios - 参数标签 '(URL:)' 与任何可用的重载都不匹配

ios - 在 iOS 设备 XCODE8 上没有进行调试

swift - Xcode 不显示编译错误

ios - 为什么用swift录制后听不到音乐?

ios - 如何将JSON放入NSMutableArray

ios - 如何在 Swift 中使用 UISlider 更改 UIImageView 中的图像

ios - CocoaPods、Swift 3 和 Xcode 8 的 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES 是什么