向表视图获取数据

时间:2018-07-06 18:16:10

标签: arrays swift uitableview segue cell

在我的第一个vc(ViewController)中,我具有操作为performSegue的按钮。在覆盖功能prepare(for segue:)中,我想将数据发送到另一个视图控制器。

这是我的代码:

if segue.identifier == "nextVC" {
        let data1 = ["TITLE", "TITLE2"]
        let data2 = ["DESCRIPTION", "DESCRIPTION 2", "DESCRIPTION 3"]
        let destination = segue.destination as! DestinationController
        destination.cellString1 = data1
        destination.cellString2 = data2
        destination.array = array

在第二个vc(DestinationController)中,我具有变量cellString1cellString2array,如下所示:

var array: [String] = []
var cellString1: [String] = []
var cellString2: [String] = []

在数组中,我发送到第一个vc中的tableView单元格的第二个vc id,如下所示:

["0", "1", "1", "0", "1"]

在第二个vc中,我也拥有tableView以及代码(在tableview(cellForRowAt :)中),如下所示:

if array[indexPath.row] == "0" {
        cell.textLabel?.text = cellString1[indexPath.row]
        cell.textLabel?.textColor = UIColor.black
        cell.textLabel?.font = UIFont.boldSystemFont(ofSize: 16)
        cell.backgroundColor = UIColor.black
        return cell
    } else if array[indexPath.row] == "1" {
        cell2.textLabel?.text = cellString2[indexPath.row]
        cell2.textLabel?.textColor = UIColor.gray
        cell2.textLabel?.font = UIFont.systemFont(ofSize: 12)
        cell2.backgroundColor = UIColor.red
        return cell2

我要检测单元格中的数组是否具有值(0或1),然后单元格的标签从cellString1cellString2中取值并显示此标签的文本。当我删除单元格textLabel配置时,单元格背景的颜色是正确的(black, red, red, black, red),但是在完整代码中,第(Index out of range)行有错误cell.textLabel?.text = cellString1[indexPath.row]。 可以解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

这应该是:

    destination.cellString1 = data1
    destination.cellString2 = data2
    destination.array = array
    let destination = segue.destination as! DestinationController

您应该在destination.cellString1 = data1destination.cellString2 = data2destination.array = array之后执行segue。其他这些属性将不会分配。

答案 1 :(得分:0)

您获得了2个标题,3个描述和5个色标。如果要将多个数组用作数据源,则必须确保项目数始终相同。

例如,如果您在array.count中返回numberOfRows,则cellForRow被调用5次。但是indexPath.row > 1cellString1indexPath.row > 2cellString2处没有项目。这会导致超出范围的异常。

基本上,强烈建议您不要使用多个数组作为数据源。不要这样做。

请改用自定义结构,而不是使用“ Bool”来代替“ 0”和“ 1”字符串

struct Item {
   var title : String
   var description : String
   var colorFlag : Bool
}

然后使用适当的数据创建Item实例,并传递一个数组。

答案 2 :(得分:0)

这是可以预期的,因为3个数组的计数不同,并且确保indexPath将超过cellString1,因为它包含2个项目,并且数组的第二个“ 0”位于索引3中,该计数超过{{1} }