2017-10-06 37 views
0

我有一個非常奇怪的問題,我的tableView,有時你點擊一個單元格,然後繼續,因爲它應該,但其他時間,它會繼續隨機detailViewController。 我有3個塞格斯從包含一個UIViewController連接的tableview:UITableViewCell Segue SOMETIMES連接到錯誤的控制器

的塞格斯「本模態」一detailViewController並傳遞一個自定義對象「地點」的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 :[按鈕]

這三個detailViewControllers幾乎完全相同,只是它們具有不同數量的按鈕。

的的tableView決定哪些Segue公司使用基於place.buttons

的大小有時的tableView就像它通過隨機細胞正常的等次。不確定原因。

+0

在'準備(for:)'爲什麼你使用選定的單元格再次獲得位置?它已經在'self.selectedPlace'中,或者你可以簡單地將這個地方作爲'performSegue'的'sender'參數提供給'performSegue'。 – Paulw11

+0

確定在遵循這裏給出的建議後,我認爲這是一個排序錯誤。不知何故my_sections。行與表中列出的順序不匹配! –

回答

0

似乎是my_sections是數組。在訪問它的項目之前嘗試對其進行排序。我有模擬問題,當程序從持久存儲中獲取數據並且數據數組中的項目無序時。

+0

這個問題有可能與我的一些數據依賴Google Places和Calendar API有關嗎?我只問,因爲我注意到我曾經超過了我的Google Places API查詢限制,一旦發生這種情況,tableview就會自行修復。如果你不這麼認爲,不要理會這個問題 - 我不想讓它更混亂。 –

+0

另外,我在my_sections「didSet」時對數組進行排序。我稱這個函數爲: 'return self.my_sections.sort(by:{$ 0.index <$ 1.index})' –

+0

你是否用行排序子數組?也許'self.my_sections.sort(by:{$ 0.index <$ 1.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

如此真實。感謝您發現這一點。我不確定這是否會解決我的問題,因爲就像問題所說的那樣,它是如此隨機發生的。我可以告訴的一點是,它比以前更有可能在今天發生,而我的數據依賴於Google地方信息和日曆API –

+0

剛剛實施了您的更改,問題仍在進行中。很不確定爲什麼!在視圖控制器之間附加segse是不好的(而不是從tableviewcell到視圖控制器?) –

0

我想通了這個問題,我很抱歉給誰花時間在這裏的人,我沒有提供足夠的信息,任何人解決這個問題。

我的tableview從

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)") 

而且我看到的tableView被安排比列是如何排序的非常不同,因爲如果有兩個不同的陣列。當然,就是這個問題。

我的tableView被顯示在視圖中SORTED_ROWS陣列而segueing到

my_sections [indexPath.section]。 [indexPath.row] 而不是my_section [indexPath.section]。 sorted_rows [indexPath.row]

問題解決了。愚蠢的錯誤。再次感謝所有幫助我簡化代碼的人。