我声明了一个包含所有变量的类。
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单元格上显示数组的内容(每个单独的单元格上)?
答案 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
。我遇到的最佳解决方案是使用switch
或enum
。由于switch
或enum
,您可以为每一行添加条件,并根据该条件打印array
中的项目。在这里,我将简单的array
项目“标题”设为case
,并根据打印出的array
类。
解决方案: - 以下代码帮助我实现了我的要求。
注意: - enum
比switch
更受欢迎。我使用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
}