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

时间:2017-02-14 07:43:05

标签: ios swift3 xcode8 tableviewcell

我有这个JSON数据

move.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 中显示该值

我有这四个快速文件。我在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)
    }
}

Move.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() }
}

感谢有人可以提供帮助。感谢。

1 个答案:

答案 0 :(得分:2)

您只需设置MoveDetails视图控制器的属性即可。并作为一个建议

  • 您可以只存储refnoString类型的一个属性,而不是在dtfromString中存储MoveDetailsMove属性:
  • 缓存MoveDetails视图控制器以重复使用
  • 实施viewDidAppear以更新MoveDetails个出口

所以:

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)
    }
}

然后,在viewDidAppear视图控制器中覆盖MoveDetails,然后只需将值填入文本标签出口。

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