2017-03-06 5 views
0

私はSwift 3とXcode 8.2を使用しています。Swift 3 - 各テーブルビューセルに一意の情報を渡す方法

こんにちは、私は何をしようとしているのか、誰かが私の問題を肉体的に助けてくれることを期待して何をしたのかを完全に説明しようとします。

ここは私のストーリーボードです。

enter image description here

これは、タブバーコントローラの最初のタブです。それは、セルをクリックすると、一意の情報を持つ別のテーブルビューコントローラ(表2)を表示する、テーブルビューコントローラ(表1と呼ぶ)で構成されます。例として、表1に「フルーツ」、「野菜」、「タンパク質」というタイトルのセルがあり、「フルーツ」をクリックすると表2に「Apple」、「Orange」、「Pear」が表示されているとします。

私の最初の質問は:私のストーリーボードは、表1のセルを表1のクリックしたものに応じて一意にする動作を正確に設定していますか?あるいは、表2の細胞はすべて同じであろうか?

移動先:表1のコンテンツはすでに正常に生成されていますが、表2の固有のコンテンツが問題になります。

表2のコンテンツはタブバーコントローラの別のタブで生成され、まずそれをそのビューに渡す必要があります。

他のタブでは、このようなことをしようとしています。基本的には、表2にアクセスしようとしていて、そこにフィールドを設定しようとしていても入力されません。

let table2VC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "table2VC") as! Table2VC 
table2VC.unique_title_label = UILabel() 
table2VC.unique_title_label.text = "Some unique text" 
表2 VCで

var unique_title_label : UILabel! 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    ... 
    table2cell.titleLabel = unique_title_label 
    table2cell.mytvc = self 
    return table2cell 
} 

そしてTable2Cell中:

@IBOutlet weak var titleLabel : UILabel! 

そして、私は、対応する表2のラベルにコンセントをリンクしました。ただし、これを実行すると、一意のラベルに値が設定されません。ストーリーボードには「ラベル」としか書かれていません。

ご協力いただければ幸いです。

答えて

0

したがって、2つのデータの間でデータを受け渡したいとします。UITableViewControllers。まず、あなたはあなたについて考える必要がありますdata structure、それはあなたが最初のテーブルビューに提示するデータを必要とすることを意味し、データはもちろん、2番目のテーブルビューにも表示されます。 2番目のtableViewは最初のものがポピュレートされるのを待っているためです。したがって、あなたのdataStructureは非常に重要です。以下のような

例えば

いくつかのこと:最初のテーブルビューでそう

struct personInfo { 
    var firstName:String 
    var lastName:String 
    var detailInfos:[String] 
} 

、あなたはすべての希望を知っているとしても、各行がfirstnameを持つことになり、この現在の例では意味独自のデータ、lastnameが含まれており、detailInfos

またはtableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)のいずれかを使用すると、準備がdidSelectRowAtより先に呼び出されて奇妙な動作をするため、両方を使用しないでください。この例では

struct personInfo { 
    var firstName:String 
    var lastName:String 
    var detailInfos:[String] 
} 

enum segueIdentifier:String { 
    case first_id = "passDataViaSegue" 
} 

class FirstTableView: UITableViewController { 

    var personInfos:[personInfo]! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     personInfos = [ personInfo(firstName: "Joe", lastName: "Doe", detailInfos: [ 
       "we need this datat","we are here my man","I am not amateur" 
      ]) 
     ] 
     tableView.delegate = self 
     tableView.dataSource = self 
     tableView.reloadData() 

    } 

    override func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int)->Int { 
     return personInfos.count 
    } 


    override func tableView(_ tableView:UITableView, cellForRowAt indexPath:IndexPath)->UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
     cell.textLabel?.text = personInfos[indexPath.row].firstName 
     cell.detailTextLabel?.text = personInfos[indexPath.row].lastName 
     return cell 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == segueIdentifier.first_id.rawValue { 
      let destination = segue.destination as! SecondTableView 
      guard let row = tableView.indexPathForSelectedRow?.row else { 
       return 
      } 
      destination.detailArr = personInfos[row].detailInfos 
     } 
    } 

} 

class SecondTableView: UITableViewController { 

    var detailArr:[String]? 

    var _details = [String]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     guard let details = detailArr else { return } 
     _details = details 
     DispatchQueue.main.async { 
      self.tableView.reloadData() 
     } 
    } 

    override func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int)->Int { 
     return _details.count 
    } 


    override func tableView(_ tableView:UITableView, cellForRowAt indexPath:IndexPath)->UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
     cell.textLabel?.text = _details[indexPath.row] 
     return cell 
    } 
} 

が、私はちょうど別のデータを、あなたと同じ設定を使用していて、デフォルトTableViewCell

そこに私の完全な例です。

関連する問題