UITableViewCell Segue SOMETIMES连接到错误的控制器

时间:2017-10-06 20:45:57

标签: ios swift uitableview

我的tableView有一个非常奇怪的问题,有时你单击一个单元格并按预期进行分段,但有时候它会转换为随机的detailViewController。 我从包含tableview的UIViewController连接了3个segue:

segues“以模态方式呈现”detailViewController并将自定义对象“place”传递给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对象有place.buttons:[Button]

三个detailViewControllers几乎完全相同,只是它们有不同数量的按钮。

tableView根据place.buttons的大小决定使用哪个segue

有时tableView的工作方式与正常情况相同,有时则会传递随机单元格。不确定原因。

3 个答案:

答案 0 :(得分: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
    } 
}

答案 1 :(得分:0)

似乎my_sections是数组。尝试在访问它之前对其进行排序。我有类似的问题,当程序从持久存储中获取数据并且数据数组中的项是无序的。

答案 2 :(得分: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数组,同时转到

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

问题解决了。愚蠢的错误。再次感谢帮助我简化代码的所有人。