2017-02-14 6 views
0

は私がSwift 3.0の新しいViewControllerにTableViewCellの値を渡す方法は?

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

このJSONデータ

move.jsonはこれまでのところ、私はTableViewCellに値をフェッチするために管理しています。

しかし、私の目標は、その値がMoveDetails.swift

で表示することができ、私はこれら四つの迅速なファイルを持っているMoveDetails.swiftにViewController.swiftから値を渡すことです。 ViewController.swiftとMoveDetails.swiftに問題があります。私はどのように新しいコントローラに値を渡すか分からない。

コードは次のとおりです。

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

誰かが助けることができるかどうか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() } 
} 

は感謝しています。ありがとう。

+0

を行うために利用可能なXcodeのを持っていないので、これはあなたがこれまでにしようとしているリンク何を、いくつかの時間を尋ねてきましたか? –

+0

http://stackoverflow.com/questions/28315133/swift-pass-uitableviewcell-label-to-new-viewcontrollerしかし、なぜMoveDetails.swiftで値がまだ空であるのか分かりません。 – Jamilah

答えて

2

MoveDetailsビューコントローラのプロパティを設定するだけで済みます。そして

  • 代わりMoveDetailsrefnoStringdtfromStringプロパティを格納する提案として、あなただけのタイプMoveのプロパティを1つ格納することができ:
  • キャッシュMoveDetailsビューコントローラは、それが
  • MoveDetailsコンセントを更新するviewDidAppearを実装し再利用します

so:

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

次にviewDidAppearMoveDetailsビューコントローラにオーバーライドして、テキストラベルのアウトレットに値を入力します。

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

構文エラーが原因私は現在チェック

+0

viewDidの読み込みは、テキストラベルを埋め込むのに適しています。 –

+0

答えのMoveDetailsを更新できますか?ありがとう – Jamilah

+0

@Inderですが、常に新しい 'MoveDetails'ビューコントローラを作成する場合に限ります。再利用すると、viewDidAppearを使うほうがいいです。 –

関連する問題