在tableView单元格中显示类的数组

时间:2017-08-18 08:44:38

标签: ios arrays swift class

我声明了一个包含所有变量的类。

class Xyz
{
  var a: String?
  var b: String?
}

在其他viewController中,我声明了该类的数组。

 var arr = [Xyz]()
 var arr2 = ["title1","title2"]

在Json Parsing之后,我在这个数组中附加值。

var temp = Xyz()
var dict = item as! NSDictionary
temp.a = (dict.value(forKey: "a") as? String) ?? ""
temp.b = (dict.value(forKey: "b") as? String) ?? ""
self.arr.append(temp)

我应该如何在单元格中显示此数组?

cell.textLabel?.text = arr2[indexPath.row]
//The above array shows the title of the row
cell.detailTextLabel?.text = String(describing: arr[indexPath.row])
//indexPath doesn't work here (error: indexPath out of range)
//The reason is the 'arr' array has class in it

上面的语句给出了错误,因为数组中包含类,而不是值。

 cell.detailTextLabel?.text = String(describing: arr[0].a)
 cell.detailTextLabel?.text = String(describing: arr[0].b)

是我可以访问我的值的唯一方法。 因此,我无法在tableView中显示此数组。

如何在tableView单元格上显示数组的内容(每个单独的单元格上)?

3 个答案:

答案 0 :(得分:3)

代码中存在许多错误/错误的编程习惯。

首先将该类命名为以大写字母开头,并将属性声明为非可选属性,因为它们将包含非可选值。 (将可选项声明为不在不写入初始化程序的不在犯罪现象是不良习惯之一。)

在类中包含来自arr2作为title属性,以避免任何超出范围异常。

class Xyz
{
    var a : String
    var b : String
    var title : String

    init(a: String, b: String, title: String) {
        self.a = a
        self.b = b
        self.title = title
    }
}

声明数据源数组

var arr = [Xyz]() // `var arr: [xyz]()` does not compile

填充数据源数组

let dict = item as! [String:Any] // Swift Dictionary !!
let temp = Xyz(a: dict["a"] as? String) ?? "", b: dict["b"] as? String) ?? "", title: "title1")
self.arr.append(temp) // `self.arr.append(value)` does not compile

cellForRow中从数组中获取Xyz实例并使用属性

let item = arr[indexPath.row]
cell.textLabel?.text = item.title

cell.detailTextLabel?.text = item.a + " " + item.b

由于所有属性都是字符串,所有String(describing初始值设定项(从String创建String)都是荒谬的。

答案 1 :(得分:0)

您似乎想要显示您的课程属性

替换

cell.detailTextLabel?.text = String(describing: arr[indexPath.row])

。通过

cell.detailTextLabel?.text = "\(arr[indexPath.row].a) \(arr[indexPath.row].b)"

答案 2 :(得分:0)

我完成了以下所有答案。但他们都没有产生解决方案。所有解决方案中的问题是array打印在同一个单元格上,而另一个单元格为空(包括Vadian提供的答案 - 它会给出错误,因为它会在同一行中打印所有值)。在单元格上打印array时,您必须进入循环,但没有一个答案提供。这会导致错误回复Index out of range。我遇到的最佳解决方案是使用switchenum。由于switchenum,您可以为每一行添加条件,并根据该条件打印array中的项目。在这里,我将简单的array项目“标题”设为case,并根据打印出的array类。

解决方案: - 以下代码帮助我实现了我的要求。

注意: - enumswitch更受欢迎。我使用switch因为易于理解并完成了我的工作。

let a = arr2[indexPath.row]
let item = arr[0]

switch a
{
case "title1":
   cell.detailTextLabel?.text = item.a
   return cell
case "title2" :
   cell.detailTextLabel?.text = item.b
   return cell
default:
   break
}