如何将tableView的多行传输到另一个ViewController

时间:2018-08-07 15:13:31

标签: ios swift segue

我正在尝试在我的应用中添加功能,一次将多个成员添加到一个操作中。成员列在tableView中,并且用户可以使用.allowsMultipleSelection = true函数一次选择多个行。我得到了以下代码,但这不起作用。我认为我的想法行得通,但不能以我在代码中的方式实现:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

       guard let destination = segue.destination as? AddMultipleMemberTransactionViewController,
        let selectedRows = multipleMemberTableView.indexPathsForSelectedRows else  {
            return
        }
        destination.members = members[selectedRows]
    }

这里有人知道我如何解决此问题,因为有错误:

  

不能用索引为[[IndexPath]”的下标“ [Member?]”的值

我在应用程序中具有相同的功能,但仅适用于一位成员。在selectedRows行之后的let indexPathForSelectedRow行中有我。 indexPathsForSelectedRows有类似的功能吗?
还是这是错误的方法?

2 个答案:

答案 0 :(得分:1)

您需要

destination.members = selectedRows.map{ members[$0.row] }

答案 1 :(得分:1)

如indexPathsForSelectedRows所示,它返回一个IndexPath数组。您需要做的就是基于这些路径创建一个Member对象数组。

假设您有一个“成员”数组,其中包含用户可以选择的所有成员,并且表中只有1个部分:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

   var selectedMembers: [Member] = []
   guard let destination = segue.destination as? AddMultipleMemberTransactionViewController,
    let selectedIndexes = multipleMemberTableView.indexPathsForSelectedRows else  {
        return
    }
    for selectedIndex in selectedIndexes {
      let selectedMember = members[selectedIndex.row]
      selectedMembers.append(selectedMember)
    }
    destination.members = selectedMembers
}

您还可以使用数组map()函数将for循环更改为单行操作:

let selectedMembers: [Member] = selectedRows.map{ members[$0.row] }

两者都应该有效地做同样的事情。