2017-10-06 8 views
0

私のtableViewで非常に奇妙な問題が発生しています。時にはセルをクリックし、必要に応じてセグメントしますが、ランダムなdetailViewControllerにセグメンテーションします。 detailViewControllerへUITableViewCellエラーが間違ったコントローラに接続しました

segues「現在モーダル」detailViewControllerとカスタムオブジェクト「場所」を渡す

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    print("PLACE SELECTED: SECTION \(indexPath.section) ROW \(indexPath.row) :: \(my_sections[indexPath.section])") 
    self.selectedPlace = my_sections[indexPath.section].rows[indexPath.row] 
    let buttons_count = self.selectedPlace!.buttons.count 
    switch buttons_count { 
    case 0: 
     self.performSegue(withIdentifier: SegueIdentifier.NoButton.rawValue, sender: self.tableview.cellForRow(at: indexPath)) 
    case 1: 
     self.performSegue(withIdentifier: SegueIdentifier.OneButton.rawValue, sender: self.tableview.cellForRow(at: indexPath)) 
    case 2: 
     self.performSegue(withIdentifier: SegueIdentifier.TwoButton.rawValue, sender: self.tableview.cellForRow(at: indexPath)) 
    default: 
     break 
    } 

} 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if (sender as? PlaceTableViewCell) != nil { 
     if let indexPath = self.tableview.indexPathForSelectedRow { 
      let place = self.my_sections[indexPath.section].rows[indexPath.row] 
      navigationController?.view.backgroundColor = UIColor.clear 

      switch(segue.identifier!) { 

      case SegueIdentifier.NoButton.rawValue: 
       assert(segue.destination.isKind(of: PlaceDetailsViewController.self)) 
       let vc = segue.destination as! PlaceDetailsViewController 
       vc.place = place 

      case SegueIdentifier.OneButton.rawValue: 
       assert(segue.destination.isKind(of: OneButtonViewController.self)) 
       let vc = segue.destination as! OneButtonViewController 
       vc.place = place 

      case SegueIdentifier.TwoButton.rawValue: 
       assert(segue.destination.isKind(of: TwoButtonViewController.self)) 
       let vc = segue.destination as! TwoButtonViewController 
       vc.place = place 

      default: break 
      } 
     } 
    } 
} 

場所オブジェクトがplace.buttonsがあります 私はテーブルビューが含まれているのUIViewControllerから接続3 seguesを持っています:[Button]

3つのdetailViewControllerはボタンの数が異なる以外はほとんど同じです。

のtableViewは、時々のtableViewは、それがランダムなセルを通過し、正常およびその他の回のように動作しますplace.buttons

のサイズに基づいて使用するセグエを決定します。理由がわからない。

+0

'prepare(for:)'なぜ、選択したセルを使って場所をもう一度取得するのですか?すでに 'self.selectedPlace'に入っています。あるいは単に' performSegue'の 'sender'引数としてその場所を指定することもできます。 – Paulw11

+0

ここに記載された助言の多くを守った後、私はソートエラーであると思います。何とかmy_sections。行は表に記載されている順序と一致しません。 –

答えて

0

my_sectionsのように見えます。アイテムにアクセスする前にソートしてみてください。私は、プログラムが永続的なストアからデータを取得し、データ配列内の項目が順序付けられていないときに、シムラ問題を抱えています。

+0

この問題は、私のデータの一部がGoogleプレイスとカレンダーAPIに依存しているという事実と関係している可能性がありますか? Google Places APIのクエリの制限を一度超えてしまったことに気がつき、すぐにテーブルビューが修正されたことに気付きました。そう思わない場合は、この質問を無視してください。私はもっと混乱させたくありません。 –

+0

また、my_sectionsが "didSet"のときに配列をソートします。私はこの関数を呼び出します: 'return self.my_sections.sort({$ 0.index <$ 1.index}によって)' –

+0

行でサブアレイをソートしますか?たぶん 'self.my_sections.sort(by:$ {index.index} $)はグループ内の行ではなくグループのみをソートします – Axazeano

1

あなたは次のようにこの問題を解決するために、あなたのprepare(for:方法を簡素化することができます。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    navigationController?.view.backgroundColor = UIColor.clear 

    switch(segue.identifier!) { 

    case SegueIdentifier.NoButton.rawValue: 
     assert(segue.destination.isKind(of: PlaceDetailsViewController.self)) 
     let vc = segue.destination as! PlaceDetailsViewController 
     vc.place = self.selectedPlace 

    case SegueIdentifier.OneButton.rawValue: 
     assert(segue.destination.isKind(of: OneButtonViewController.self)) 
     let vc = segue.destination as! OneButtonViewController 
     vc.place = self.selectedPlace 

    case SegueIdentifier.TwoButton.rawValue: 
     assert(segue.destination.isKind(of: TwoButtonViewController.self)) 
     let vc = segue.destination as! TwoButtonViewController 
     vc.place = self.selectedPlace 

    default: break 
    } 
} 
+0

ですこれを見つけてくれてありがとう。質問が言うように、これは私の問題を必ず解決するかどうかは分かりません。無作為に起こります。私の言うことは、以前よりも日中にLATERが発生する可能性が高く、データがGoogleプレイスとカレンダーAPIに依存していることです。 –

+0

変更を実装しただけで問題は解決していません。なぜか分からない! View Controller間でSegueを接続するのは悪いですか? –

0

私はこの問題を考え出した、私はここに時間がかかった人に申し訳ありません、私はに誰のための十分な情報を与えていませんこの問題を解決します。

私のテーブルビューには、私の「節」のモデルは次のようになります

var my_sections: [Section] = [] { 
     didSet { 
      return self.my_sections.sort(by: { $0.index < $1.index}) 
     } 
} 

から情報を取得します。

struct Section: Ordered { 
    var section: PTPlace.Section 
    var rows: [PTPlace] 
    var sorted_rows: [PTPlace] { 
     return self.rows.sorted(by: { $0.open_status.rawValue > $1.open_status.rawValue }) 
    } 
} 

が、私は行がセクション内ではなく、節間まで混入されたとき、何かがアップしました気づきました。

だから私はdidSelectRowAtIndexPathメソッドに次の行を追加しました:

print("PLACE SELECTED: SECTION \(indexPath.section) ROW 
\(indexPath.row) :: \(my_sections[indexPath.section].rows[indexPath.row].name)") 

そして、私は2つの異なるアレイがあったかのようにtableViewは、非常に異なる行がソートされた方法よりも配置されていたことがわかりました。そして確かにそれは問題でした。

my_sections [indexPath.section]にsegueingながら

私のtableViewは、ビューにsorted_rows列を表示しました。 [indexPath.row] my_section [indexPath.section]の代わりに。 sorted_rows [indexPath.row]

問題を解決しました。愚かな間違い。私のコードを簡素化するのを手伝ってくださったみなさん、ありがとう。

関連する問題