如何为不同的UTableView部分使用不同的segue并传递数据

时间:2016-04-13 13:49:55

标签: ios arrays swift uitableview

我正在使用带有两个部分的UITableView,我使用名为sections的数组作为节标题标题,使用一个名为sectionItems的数组,其中包含两个字符串值数组以填充部分。

let sections = ["Section 1", "Section 2"]

var sectionItems = [ ["One","Two", "Three", "Four"], ["Another One"] ]

UITableView可以很好地显示数据,但是当用户选择表格视图单元格时,我试图进行切换。问题是我有两个不同的部分用于两个不同的部分。

如何在适当的部分使用每个segue?

这就是我的尝试,

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell

    tableView.deselectRowAtIndexPath(indexPath, animated: true)


    //Optional error occurs here for section property 
    let section = self.tableView.indexPathForSelectedRow!.section

    if section == 0 {
        self.performSegueWithIdentifier("sectionOneSegue", sender: cell)
    } else if section == 1 {
        self.performSegueWithIdentifier("sectionTwoSegue", sender: cell)
    }

}

但是,在声明属性部分时,这会给我一个可选错误。

同样,当启动segue时,我试图将相关数据传递给细节控制器。

这里我试图确保在sectionItems数组中我使用节编号使用数组中的第一个数组,然后使用所选单元格行的确切字符串值。

    if segue.identifier == "sectionOneSegu" {

        let navController = segue.destinationViewController as! UINavigationController
        let detailController = navController.topViewController as! DetailViewController
        var row = self.tableView.indexPathForSelectedRow!.row


        detailController.upcomingType = sectionItems[1][row]            
        detailController.mode = 1

    }

我不确定这是否正确。有人可以帮我解决为什么在选择单元格行时发生错误以及如何修复它以使用正确的segue?我怎样才能传递相关数据?

2 个答案:

答案 0 :(得分:3)

首先,您不需要在您的“选择路径路径路径”中获取该单元格。方法,因此创建对单元格的引用的第一行是不必要的。

你有一个索引路径,其中包含一个行和段索引,用它来从sectionItems数组中获取数据,例如

let data = sectionItems[indexPath.section][indexPath.row]

switch indexPath.section {
case 0:
    self.performSegueWithIdentifier("sectionOneSegue", sender: data)
case 1:
    self.performSegueWithIdentifier("sectionTwoSegue", sender: data)
default:
    break
}

这应该是你在该方法中所需要的全部内容。

然后,您可以覆盖prepareForSegue方法并检查segue.identifier属性以查看已执行的segue,并从那里提取destinationViewController。拥有视图控制器后,您可以通过视图控制器上的属性将数据传递给它。

if segue.identifier == "sectionOneSegue" {

    guard let data = sender as? String,
    newViewController = segue.destinationViewController as? NewViewController else {
        return
    }

    newViewController.data = data
}

在上面的代码中,我确保发送方是预期的数据类型(从上面的performSegueWithIdentifier方法发送的那个)并且目标控制器是我想要的那个,然后我知道一切都正确我在目的地控制器上设置了我想要发送给它的数据。

我希望这会有所帮助。

答案 1 :(得分:1)

由于你在tableView:didSelectRowAtIndexPath:方法内,你不需要像这样查找选择的索引路径:

let section = self.tableView.indexPathForSelectedRow!.section

在变量中为您提供了所需的indexPath,因此您需要做的就是

if indexPath.section == 0 {
    self.performSegueWithIdentifier("sectionOneSegue", sender: cell)
} else if indexPath.section == 1 {
    self.performSegueWithIdentifier("sectionTwoSegue", sender: cell)
}

或使用一个为截面索引提供segue名称的数组,如下所示:

private static let segueForIndex = ["sectionOneSegue", "sectionTwoSegue"]
...
self.performSegueWithIdentifier(MyClass.segueForIndex[indexPath.section], sender: cell)