2017-02-14 47 views
0

У меня есть этот JSON данныеКак передать значение TableViewCell в новый ViewController в Swift 3.0?

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. Я не уверен, как передать значение в новый контроллер.

Код, указанный ниже.

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

это было предложено несколько раз, что ссылки вы пробовали до сих пор? –

+0

http://stackoverflow.com/questions/28315133/swift-pass-uitableviewcell-label-to-new-viewcontroller.Но я не уверен, почему значение все еще пустое на MoveDetails.swift – Jamilah

ответ

2

Вам просто нужно будет установить свойства вашего контроллера изображения MoveDetails. И как предложение

  • Вместо хранения refnoString и dtfromString свойства в MoveDetails, можно просто хранить одно свойство типа Move:
  • Cache 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 доступных, чтобы сделать проверку

+0

viewDid load лучше всего заполнить текстовые метки –

+0

Можете ли вы обновить MoveDetails в своем ответе? Спасибо – Jamilah

+0

@Inder, но только если вы всегда создаете новый контроллер просмотра MoveDetails. Если вы его повторно используете, вам лучше использовать viewDidAppear –

 Смежные вопросы

  • Нет связанных вопросов^_^