如何在不同的领域使用一个视图控制器 类

How can I use one view controller with different Realm classes

我正在尝试创建一个应用程序,其中有 4 个按钮,每个按钮对应一个不同的类别。现在类别是保存在 swift 文件中的不同领域对象。

class HealthData: Object {
    @objc dynamic var name : String = ""
}

class SelfImprovement: Object {
    @objc dynamic var name : String = ""
}

class TopSecret: Object {
    @objc dynamic var name : String = ""
}

class Ohter: Object {
    @objc dynamic var name : String = ""
}

现在我的问题是我希望带有 TableView 的单个视图控制器具有不同的数据,这些数据将从相应的类别传递到 TableView。

我的想法是我可以创建 var categories : Results<HealthData>! 并使用 if 语句将类别更改为 Results 等,使用 prepare for segue 知道按下了哪个按钮。

override func viewWillAppear(_ animated: Bool) {
        if categoryNo == 1 {
            title = "Health"
        } else if categoryNo == 2 {
            title = "Self Improvement"
            categories = Results<SelfImprovement>!
        }
    }

当然,XCode不能将类型'Results?.Type'的值赋值给类型'Results?'。

有什么想法吗?

谢谢大家的宝贵时间!

所以问题是你想重新使用 tableView 来显示来自不同 tableView 数据源的数据。您正朝着正确的方向前进,但答案是告诉 tableView 从哪里获取数据。

我将其与真正的基本代码配对,所以不要复制粘贴 - 尽量保持简短。

假设我们有一个带有 tableView 的视图控制器

class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {

@IBOutlet weak var myTableView: NSTableView!

var myHealthArray = [String]() //one tableview datasource
var mySelfImprovementArray = [String]() //another tableview datasource
var tableType = "" //will tell the tableView what it should be displaying

然后,再往下,我们有填充 tableview 的 tableView 委托方法

func numberOfRows(in tableView: NSTableView) -> Int {
    if self.tableType == "health" {
        return self.myHealthArray.count
    } else if self.tableType == "self_improvement" {
        return self.mySelfImprovementArray.count
    } //etc
}

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let cell = tableView.makeView(withIdentifier: myIdentifier, owner: self) as! NSTableCellView
    var s = ""
    if self.tableType == "health" {
        s = self.myHealthArray[row]
    } else if self.tableType == "self_improvement" {
        s = self.mySelfImprovementArray[row]
    } //etc
    cell.textField?.stringValue = s
    return cell
}

所以这里的想法是将 tableType 设置为应该在 tableView 中显示的任何内容,然后 tableView 委托方法中的逻辑将知道从哪个数据源数组获取数据。

请务必记住,Realm 结果是同质的,因此它们只能存储一种类型的对象。

在此示例中,我将数据源定义为字符串,但在您的情况下,它们可能是领域结果对象。如果它们是字符串,您可以重新使用数组,因为它只包含字符串对象。但是,如果数据源是 Realm Results,您将需要单独的数组,如此答案所示。