2016-07-23 6 views
2

私の最終的な目標は、変数を渡しながら別のビューコントローラに移動することです。tableViewからprepareForSegueに変数を渡しますか?

は、ここに私のコードです:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let name : String=arrDict[indexPath.row].valueForKey("name") as! String 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if segue.identifier == "SecondSegue" { 
     let viewController = segue.destinationViewController as! SecondViewController 
     viewController.passedVariable = name 
    } 
} 

あなたが見ることができるように、私は機能prepareForSegueに変数nameを渡すしようとしています。私が言ったように、私の究極の目標は、別のビューコントローラに変数を渡し、そのビューを開くことです。

今、prepareForSegueはこれを実行できますが、変数を渡すだけで済みます。おそらく、それを直接func tableViewで行う方法がありますか?

+0

セルをクリックすると、セグをしますか? – Sethmr

+0

@Sethmrはい私は – johnniexo88

答えて

1
var name: String?  

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     name = arrDict[indexPath.row].valueForKey("name") as? String 
     performSegueWithIdentifier("SecondSegue", sender: nil) 

    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
     if let viewController = segue.destinationViewController as? SecondViewController { 
      if name != nil { 
       viewController.passedVariable = name! 
      } else { 
       print("failed to get name from dictionary") 
      } 
     } 
    } 

私はこれがあなたが探していると信じています。 cellForRowAtIndexPathに変数名を代入しないでください。なぜなら、この関数は通常、tableViewsのライフサイクルを通して何度も呼び出されるからです。また、「名前」はクラス変数である必要があります。そのため、ある関数で代入して別の関数に渡すことができます。 cellForRowAtIndexPathは、tableViewの個々のセルの値とUIを割り当てるための関数です。他に何かをする時間はほとんどありません。

+0

これを詳しく説明してください... "この関数は通常、tableViewsの寿命を通して何度も呼び出されるので、変数をcellForRowAtIndexPathに代入しないでください。" – johnniexo88

+0

tableView.reloadData()を呼び出すたびに、テーブルビューにあるすべてのセルに対してcellForRowAtIndexPathが呼び出されます。その関数内の変数名を宣言すると、関数の外で使用されることはまずありません。なぜなら、関数のローカルなので、現在のデザインで2番目の要素は常に任意のセルではなくtableViewの最後の要素と等しいからです。そこにあるnameの値を設定したいのであれば、選択したセルをトラッキングする別の変数を設定しなければならず、ちょっと無駄かもしれません。 – Sethmr

1

didSelectRowAtIndexPathメソッドにコードを挿入します。選択したindexPathをインスタンス変数に保存し、segueを呼び出します。

prepareForSegueでは、保存されたindexPathを使用して、必要な文字列をモデルからロードし、コピー先VC(viewController)に渡します。

+0

することができますいくつかのコードを投稿することができますので、私はあなたがこれと一緒に行くのか知っていますか? – johnniexo88

+0

私はそれが実際の学習ではなくコピー/ペーストプログラミングにつながると思うので、このような簡単なステップのコードを投稿するファンではありません。しかし、@Sethmrはサンプルコードを提供しました。 –

関連する問題