2016-09-01 8 views
-1

セルからsegue経由で別のコントローラにtitle(String)を渡そうとしましたが、実際には動作しますが、動作は完全に間違っています。セルからviewControllerにデータを渡す際の不具合

メインコントローラ

var cellTitlePressed:String? 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    cellTitlePressed = categories[indexPath.row].title 
    performSegue(withIdentifier: "toCategory", sender: self) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let destination = segue.destination as? CategoryVC { 
     if let title = cellTitlePressed { 
      destination.categoryTitle = title 
     } else { 
      destination.categoryTitle = "Undefined category" 
     } 
    } 
} 

私は、セルをクリックした場合(例えば「ビール」のカテゴリー)私は条件が初めてでは動作しません推測するので、私は「未定義のカテゴリー」のタイトルを参照してください。

先のコントローラ

private var _categoryTitle: String! 

var categoryTitle:String { 
    get { 
     return _categoryTitle 
    } 
    set { 
     _categoryTitle = newValue 
    } 
} 

@IBOutlet weak var categoryTitleLabel: UILabel! 

@IBAction func backButtonPressed(_ sender: AnyObject) { 
    dismiss(animated: true, completion: nil) 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    categoryTitleLabel.text = categoryTitle 
} 

その後、私は戻ってくる(解任)と別のカテゴリ(「コーヒー」)をクリックすると、私は以前のタイトルを参照 - ように代わりに「コーヒー」の「ビール」をし、 。だから、いつも一歩遅れました。

+0

categoryTeleの名前の代わりに、カスタムセッターとゲッターを削除してください。 – BlackM

+0

prepareForSegueのcellTitlePressedの値は何ですか? –

+0

http://stackoverflow.com/questions/34109152/how-to-update-selected-row-before-segueの重複 – matt

答えて

0

固定

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let destination = segue.destination as? CategoryVC { 
     let currentCell = tableView.indexPathForSelectedRow?.row 
     if currentCell != nil { 
      destination.categoryTitle = categories[currentCell!].title 
     } else { 
      destination.categoryTitle = "Undefined category" 
     } 
    } 
} 
私はあなたがのviewDidLoadとviewWillAppearにブレークポイントを使用してVをチェックすることをお勧め
0

私はセグエを介して他のコントローラにセルからタイトルを渡す(String)をしようとしてきた

ファインが、その後、このコードを削除します。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    cellTitlePressed = categories[indexPath.row].title 
    performSegue(withIdentifier: "toCategory", sender: self) 
} 

あなたは」セグを2回実行します.1回はセグがストーリーボードでトリガーされ、もう1回はコードでトリガーされるためです。代わりに、ストーリーボードでトリガーさせ、残りのコードと共にcellTitlePressedperformSegueに設定してください。

また、がのプロパティである必要がある理由もわかりません。タイトルを次のView Controllerに渡すためには、それをローカル変数として使用してください。だから、これはあなたが必要とするすべてである:categoryTitle_categoryTitleのフロントエンドとしての行為を除き、何もしませんので、

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let destination = segue.destination as? CategoryVC { 
     let cellTitlePressed = categories[indexPath.row].title 
     if let title = cellTitlePressed { 
      destination.categoryTitle = title 
     } else { 
      destination.categoryTitle = "Undefined category" 
     } 
    } 
} 

はまた、あなたの他のビューコントローラで、_categoryTitlecategoryTitleの使用は、奇数です。プラス、限り、あなたは、私がイベントの順序は重要ではありませんようにインターフェースを更新するためにそれを使用することをお勧め、というやっているよう:

var categoryTitle:String { 
    get { 
     return _categoryTitle 
    } 
    set { 
     _categoryTitle = newValue 
     if categoryTitleLabel != nil { 
      categoryTitleLabel.title = _categoryTitle 
     } 
    } 
} 

しかし、個人的に、私は_categoryTitleを排除し、セッターを使用しますこのためオブザーバー:

var categoryTitle:String = "" { 
    didSet { 
     if categoryTitleLabel != nil { 
      categoryTitleLabel.title = categoryTitle 
     } 
    } 
} 
+0

はい、私はローカル変数として使用しようとしましたが、 Any型の値を代入しますか?私はその行を削除しました、そしてsegueはまだ素晴らしい、素晴らしい作品です。しかしprepareメソッドはindexPathを知らないので、この行を 'let indexPath = self.tableView.indexPathForCell(UITableViewCellとしての送信者)'に追加し、 'Any? UITableViewCell ' –

+0

'がlet selectedIndex = self.tableViewに可逆ではありません。indexPath(for:UITableViewCellのような送信者) 'は問題なく動作しますが、何百万ものエラーが発生していますので、私は何か間違っていると思っています –

+0

それは素晴らしいですが、私はコンパイルエラーを修正するためにあなたのコードをテストしなかった。コンパイルエラーは言及しなかったからだ。あなたは建築上の困難について話しました。それが私の答えが意図しているものです。 – matt

関連する問題