2017-05-16 16 views
1

あるビューコントローラーから別のビューコントローラーに値を渡そうとしています。テストしたところ、これは問題なく、自分のコードで動作します。しかし、私はセルラベル値を取ろうとしているときに問題があります。私はgoogleとstackoverflowで見つけたすべてを試しましたが、これに関する答えはありません。 // I THINK THE PROBLEM IS ON THE NEXT LINE OF CODEというコードにコメントを追加して、どこにいらっしゃいましたかわかりやすくしています。UITableViewCellからラベル値を取得できません

マイコード:あなたがcellForRowAtで行うようにあなただけのデータストアから生の値を使用していないのはなぜ

import UIKit 


class PlacesTableViewController: UITableViewController { 

@IBOutlet weak var placesTableView: UITableView! 

var places = [Places]() 
var valueToPass:String! 
let cellIdentifier = "PlacesTableViewCell" 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
     // Table view cells are reused and should be dequeued using a cell identifier. 


     guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? PlacesTableViewCell else { 
      fatalError("The dequeued cell is not an instance of PlacesTableView Cell.") 
     } 

     let place = places[indexPath.row] 

     cell.placeLabel.text = place.name 
     cell.ratingControl.rating = place.rating 

     return cell 

    } 

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    { 
     print("You selected cell #\(indexPath.item)!") 


     let indexPath = placesTableView.indexPathForSelectedRow 

     // I THINK THE PROBLEM IS ON THE NEXT LINE OF CODE 
     let currentCell = placesTableView.cellForRow(at: indexPath!)! as UITableViewCell 

     print(currentCell.detailTextLabel?.text ?? "Failed to use Cell Label") 
     valueToPass = currentCell.detailTextLabel?.text ?? "Failed to use Cell Label" 
     performSegue(withIdentifier: "ShowCommentsTableViewController", sender: self) 

    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if (segue.identifier == "ShowCommentsTableViewController") { 
      // initialize new view controller and cast it as your view controller 
      let viewController = segue.destination as! CommentsTableViewController 
      // will be stored in passedValue on the CommentsTableViewController 
      viewController.passedValue = valueToPass 
      //print (viewController.passedValue ?? "") 
     } 
    } 

} 
+0

セルではなくデータソースを使用してください。また、古典的な 'UITableViewCell'ではなく' PlacesTableViewCell'を使用しています。 'detailTextLabel'ではなく' UILabel'として 'placeLabel'を使用しています。 – Larme

+0

'places'配列を使ってデータを取得するだけで、既にdidSelectメソッドにindexPathがあります。 – Aks

+0

ヒント#1:Scriptableの答えに従ってください。ヒント#2:あなたが見つけたものを読んで理解してから、それを実装してください。あなたがそれを理解していないなら、コピー/ペーストされたコードを叩くことはあなたをどこにでも連れて来ないでしょう。 – DonMag

答えて

3

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let place = places[indexPath.row] 
    valueToPass = place.name 
    performSegue(withIdentifier: "ShowCommentsTableViewController", sender: self) 
} 
+0

私の投稿を 'places [(indexPath?.row)!]'に変更するための推奨された編集 '私は拒否しました。 indexPathはオプションではありません – Scriptable

+0

しかし、私のコンパイラはそれを変更すると言っていました。私はその変更を行った後、コードが実行されていて、私が望んだことが起こった。あなたの答えをありがとう。 –

+0

さて、もう一度チェックして、必要に応じて更新します。上記の関数定義はオプションではありません。アップデート:私のためにxcodeでうまくいます – Scriptable

0

二つの基本的な問題は最初のあなたがUITableViewCell代わりのPlacesTableViewCell及び第二の問題にあなたのセルをキャストしている、あなたの現在のコードではありますが、あなたがplaceLabelを使用する代わりにカスタムセルでは利用できませんdetailTextLabelにアクセスしているということです。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

{ 
    print("You selected cell #\(indexPath.item)!") 


    let indexPath = placesTableView.indexPathForSelectedRow 

    // I THINK THE PROBLEM IS ON THE NEXT LINE OF CODE 
    let currentCell = placesTableView.cellForRow(at: indexPath!)! as PlacesTableViewCell 

    print(currentCell. placeLabel?.text ?? "Failed to use Cell Label") 
    valueToPass = currentCell. placeLabel?.text ?? "Failed to use Cell Label" 
    performSegue(withIdentifier: "ShowCommentsTableViewController", sender: self) 

} 

そして、あなたがこの面倒を通過したくない場合は、単にそのような元の配列から値を取得することができます::正しいコードはそのようになります

let place = places[indexPath.row] 
valueToPass = place.name 
+0

誰も私の答えに否定的な投票がある理由を教えたいですか? –

1

あなたdidselect方法を交換してください以下を指定してください

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{ 

    let place = places[indexPath.row] 

    valueToPass = place.name 
    performSegue(withIdentifier: "ShowCommentsTableViewController", sender: self) 

} 
+0

ありがとう!しかし、@Scriptableが最初でした。 –

関連する問題