斯威夫特 - ' [主题]没有一个名为' name' '

时间:2015-08-11 12:56:31

标签: arrays swift member

我的应用中有两个主题列表。用户可以从第二个列表中选择多个主题,将这些主题添加到第一个主题。我现在在添加过程中遇到问题。

第二个列表中的单元格由此描述:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("AddSubjectCell", forIndexPath: indexPath) as! AddSubjectCell

    let subject = Subjects[indexPath.row] as Subject
    let Semester = "\(subject.semester)"

    cell.nameLabel.text = subject.name

    cell.semesterLabel.text = "Semester"

    cell.semesterNumberLabel.text = Semester

    return cell

}

并从这个数组中获取数据:

var addSubjectsData = [ Subject(name: "A", semester: 1), Subject(name: "B", semester: 2), Subject(name: "C", semester: 3), Subject(name: "D", semester: 5), Subject(name: "E", semester: 6) ]

如果用户勾选了单元格,则激活此部分功能:

 if cell.accessoryType == UITableViewCellAccessoryType.Checkmark {
        selectedCellsData.append(Subject(name: selectedCellsData.last!.name, semester: selectedCellsData.last!.semester))

由此,

    selectedCellsData.name = cell.nameLabel.text!
    selectedCellsData.semester = cell.semesterNumberLabel.text!.toInt()!

我尝试追加的数组定义为var selectedCellsData = [ Subject(name: "Initial Subject", semester: 0)]

在第二个列表的屏幕上是一个完成按钮。如果按下,则激活此操作:

 @IBAction func saveSubjectDetail(segue:UIStoryboardSegue) {

    subjectsData.append(Subject(name: selectedCellsData.last!.name, semester: selectedCellsData.last!.semester))

选定的细胞'然后应将数据添加到数组var subjectsData = [ Subject(name: "Investments", semester: 1), Subject(name: "Statistics", semester: 1), Subject(name: "Studium Universale", semester: 2) ]

尝试运行模拟器,我收到错误" [主题]没有名为' name'"的成员。虽然,在我的数组中可以看到,有一个名为' name'的成员。

另外,当我宣布课程'主题'时,我还添加了' name':

class Subject: NSObject {
    var name: String
    var semester: Int

    init(name: String, semester: Int) {
        self.name = name
        self.semester = semester
        super.init()
    }
}

如果您有任何关于如何解决此错误的帮助,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

selectedCellsData是Subject的数组。因此,如果您需要,您应该从数组中选择一个项目。所以可能是这样的

selectedCellsData.last.name.text = cell.nameLabel.text 

答案 1 :(得分:1)

你说:

  

我创建了两个主题列表,并希望用户能够将所选主题从第二个列表添加到第一个列表。我一直在尝试直接添加从具有相同结构的另一个阵列分散注意力的单元格数据到从中获取第一个列表的数据的数组,但由于这不起作用,我现在正在尝试使用“in” - 在上面的数据集之间。这里的行是将单元格数据添加到“中间”-array

的过程

所以,假设您有两个数组,一个名为allSubjects,另一个名为selectedSubjects。我们假设你在表格中选择一行(因此有indexPath.row表示在显示我们allSubjects的表格中选择了哪一行。然后你可以这样做:

selectedSubjects.append(allSubjects[indexPath.row])

-

不幸的是,如果您取消选择一行,现在就会出现问题,如何从Subject中移除selectedSubjects。您可能不得不采用Subject符合Equatable,使用filter方法等等。

可能更容易跟踪所选行

var selectedRows = Set<Int>()

然后,当您选择一行时,您将添加一个行条目:

selectedRows.insert(indexPath.row)

当你取消选择一行时,你会删除它

selectedRows.remove(indexPath.row)

例如,您可以cellForRowAtIndexPath根据selectedRows中行的存在设置相应的附件:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("AddSubjectCell", forIndexPath: indexPath) as! AddSubjectCell

    let subject = allSubjects[indexPath.row]

    cell.nameLabel.text = subject.name
    cell.semesterLabel.text = "Semester"
    cell.semesterNumberLabel.text = "\(subject.semester)"

    cell.accessoryType = selectedRows.contains(indexPath.row) ? .Checkmark : .None

    return cell
}

然后当用户选择一行时,切换其复选标记:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if selectedRows.contains(indexPath.row) {
        selectedRows.remove(indexPath.row)
    } else {
        selectedRows.insert(indexPath.row)
    }

    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
}

如果你想要,当你完成所有工作后,要获得一系列选定的科目,你可以做以下的事情:

var selectedSubjects = [Subject]()
for row in selectedRows {
    selectedSubjects.append(allSubjects[row])
}

-

另一种方法是向selected类添加Subject属性:

class Subject {
    var name: String
    var semester: Int
    var selected = false

    init(name: String, semester: Int) {
        self.name = name
        self.semester = semester
    }
}

然后cellForRowAtIndexPath可以查看此属性:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("AddSubjectCell", forIndexPath: indexPath) as! AddSubjectCell

    let subject = allSubjects[indexPath.row]

    cell.nameLabel.text = subject.name
    cell.semesterLabel.text = "Semester"
    cell.semesterNumberLabel.text = "\(subject.semester)"

    cell.accessoryType = subject.selected ? .Checkmark : .None

    return cell
}

didSelectRowAtIndexPath可以切换它:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    allSubjects[indexPath.row].selected = !allSubjects[indexPath.row].selected

    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
}

然后,当您想要所选科目时,您可以filter他们:

let selectedSubjects = allSubjects.filter { $0.selected }

有很多方法可以给猫皮肤。