2016-08-13 5 views
0

私はテーブルビューを持っています。私はそのセルからラベル "usernameLabel"を取得し、それらに変数を割り当てる必要があります。私はその変数をprepareForSegueに渡す必要があります。 問題は、間違ったセルのラベルが間違っていることです。ここprepareForSegueのテーブルビューセルでボタンをクリックするとラベルを取得する方法

私が持っているものです。

var username: String! 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell : MainCell! = tableView.dequeueReusableCellWithIdentifier("MainCell") as! MainCell 

    username = usernameLabel.text 
    cell.button.userInteractionEnabled = true 
    let tapButton = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapLabel(_:))) 
    cell.button.addGestureRecognizer(tapButton) 

    return cell as MainCell 
} 

func tapButton(sender:UITapGestureRecognizer) { 
    performSegueWithIdentifier("ViewToView2Segue", sender: self) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "ViewToView2Segue" { 
      let userProfileViewController = segue.destinationViewController as! SecondViewController 
      secondViewController.usernamePassed = usernamePassed 
     } 
} 

簡素化質問:私はセグエを経由して別のビューコントローラにlabel.textを渡す必要があります。しかし、現在、間違ったセルからラベルを取得しています。

+0

'ユーザ名の内側にこのbuttonAction機能を追加= usernameLabel.text'はセル当たり' usernameLabel'はありますか?もしそうなら 'cell.usernameLabel.text'が必要です。しかし、何をしようとしていますか?あなたはラベルからコンテンツを渡す必要があります、それは正しいですか? –

+0

@SeanWang私はsegue経由で別のView Controllerにlabel.textを渡す必要があります。しかし、現在、間違ったセルからラベルを取得しています。 – johnniexo88

答えて

3

cellForRowAtIndexPath方法は、その結果の値を複数回割り当てるしますメソッドが動作しません、なぜボタンにアクションを追加するのではなく、tapGestureをボタンで使用していますか、cellForRowAtIndexをこのように変更してみてください。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell : MainCell! = tableView.dequeueReusableCellWithIdentifier("MainCell") as! MainCell 
    cell.button.setTitle(usernameLabel.text, forState: .Normal) 
    cell.button.addTarget(self, action: #selector(self.buttonAction(_:)), forControlEvents: .TouchUpInside) 
    return cell 
} 

今すぐあなたの ViewController

func buttonAction(sender: UIButton) { 
    let center = sender.center 
    let point = sender.superview!.convertPoint(center, toView:self.tableView) 
    let indexPath = self.tableView.indexPathForRowAtPoint(point) 
    let cell = self.tableView.cellForRowAtIndexPath(indexPath) as! MainCell //Add superview on the basis of your button hierarchy in the cell 
    username = cell.usernameLabel.text 
    print(username) 
    performSegueWithIdentifier("ViewToView2Segue", sender: self) 
} 
+0

'sender.superview!.superview! 'を使用しているコードは脆弱です。これは、セルの現在のレイアウトに依存しています。たとえば、新しい親ビュー内でボタンを移動すると、このコードは中断されます。座標空間からテーブルビューの座標空間に変換されたボタンの境界を使用し、テーブルビューにそのボタンが含まれているセルを照会することをお勧めします。私がこれを持っているコードはObjective-Cであるか、別の答えとして投稿します。 –

+0

これは私が得るエラーです: ' - [UITapGestureRecognizer superview]:インスタンスに送られたセレクタが認識できませんでした。 ' – johnniexo88

+0

編集された答えを確認してください。また、add targetを使用して、tapgestureコードを削除します。 –

0

セルに状態データを保存しないでください。あなたはあなたのモデル(おそらく配列)に必要な情報を持っている必要があります。ユーザーがセルをタップすると、選択したセルのindexPathを使用して、セルのラベルからではなく、モデルから情報をフェッチする必要があります。

(背景MVCデザインパターンを検索します。テーブルビューセルがビューオブジェクトであり、データを格納してはならない。すなわち、モデルの仕事です。)

+0

あなたは何が混乱しているかについて段落を削除しました。 – Rob

+0

一見したところで私が読んでいたコードを誤解してしまったので、その段落の一部が間違っていました。コードはまだ混乱しています。 –

+0

モデルファイルの例は何ですか? – johnniexo88

関連する問題