无法使用 [NSIndexPath] 类型的索引为 [String] 类型的值下标 - prepareForSegue

Posted

技术标签:

【中文标题】无法使用 [NSIndexPath] 类型的索引为 [String] 类型的值下标 - prepareForSegue【英文标题】:Cannot subscript a value of type [String] with an index of type [NSIndexPath] - prepareForSegue 【发布时间】:2015-12-19 17:30:09 【问题描述】:

我正在尝试使用 prepareForSegue 函数将多行从 UITableView 发送到另一个 UITableView。

当我只向第二个 UITableView 发送一个选项时,应用程序运行良好,但是当我选择多行并将它们作为标题发送到第二个 UITableView 时(例如,如果我在“a”行中单击第一个,然后是“d”行,然后是“c”行……第二个 UITableView 只显示行“c”作为标题,而不是其他 2 行),它给出了错误。

错误图片:

这些是我为第一个 UITableView 写的代码:

let array = ["a", "b", "c", "d", "e"]

@IBOutlet var initialTableView: UITableView!

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    initialTableView.allowsMultipleSelection = true


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "segueA" 
        if let destination = segue.destinationViewController as? Content 
            if let selectedRows = initialTableView.indexPathsForSelectedRows 
                destination.title = array[selectedRows]
            
        
    


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return self.array.count


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("cellA", forIndexPath: indexPath) as UITableViewCell
    cell.textLabel!.text = array[indexPath.row]
    return cell


func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    let cell = tableView.cellForRowAtIndexPath(indexPath)
    if (cell?.accessoryType == UITableViewCellAccessoryType.Checkmark) 
        cell!.accessoryType = UITableViewCellAccessoryType.None
     else 
        cell!.accessoryType = UITableViewCellAccessoryType.Checkmark
    

第二个视图包含以下几行:

var contentArray:[String] = []

@IBOutlet var contentTableView: UITableView!

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    contentArray.append(title!)


func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return contentArray.count


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 2


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cellContent = tableView.dequeueReusableCellWithIdentifier("cellContent", forIndexPath: indexPath) as UITableViewCell
    cellContent.textLabel!.text = "Second test"
    return cellContent


func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
    return contentArray[section]

那么,如果我想选择多行并将这些从第一行发送到第二个 UITableView... 我该如何解决这个错误?

谢谢。

【问题讨论】:

如果destination.title 选择行“a”、“d”和“c”,您希望将其设置为什么? @vacawama 如果我在下一个 UITableView 中选择行“a”、“d”、“c”......我可以看到这些选项,但作为标题。实际上它适用于一个选项,但我知道为什么当我尝试包含更多部分(标题)时它会出错。 您的问题是selectedRowsNSIndexPaths 的数组。你不能用它来索引你的数组。听起来您需要将字符串数组传递给第二个视图控制器,而不仅仅是设置单个字符串?对吗? @vacawama 准确!我想将字符串数组发送到第二个视图(我编辑问题,包括第二个 UITableView 的代码) @vacawama 所以.. 而不是把destination.title = array[selectedRows] 你说只是把selectedRows 【参考方案1】:

您的问题是selectedRowsNSIndexPaths 的数组。你不能用它来索引你的数组。您需要将 Strings 数组传递给您的第二个视图控制器,而不仅仅是设置单个字符串。

使用maparray 中选择字符串以传递给目标viewController 的contentArray 属性:

destination.contentArray = selectedRows.map  array[$0.row] 

您需要为destination.title 确定一个新的合理设置。

您需要从viewDidLoad 中删除此行:

contentArray.append(title!)

【讨论】:

是的!你是对的!!现在在contentArray.append(title!) 中给我一个错误错误类型:“线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)” ....顺便说一句,很好的解释 那是因为titlenil

以上是关于无法使用 [NSIndexPath] 类型的索引为 [String] 类型的值下标 - prepareForSegue的主要内容,如果未能解决你的问题,请参考以下文章

使用下标时出错:无法使用类型索引为类型值下标...

在 NSNotificationCenter 的通知的 userInfo 中传递空的 NSIndexPath

无法使用“String”类型的索引为“[[String : Any]]”类型的值下标

无法使用“Int”类型的索引为“[String : String]”类型的值下标

NSIndexPath 延伸

无法使用“Any?”类型的索引为“[AnyHashable:Any]”类型的值下标