如何将一个视图控制器与不同的Realm类一起使用

时间:2019-02-23 21:33:59

标签: ios swift realm

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

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等,并使用segue forsegue来知道按下了哪个按钮。

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

但是,当然,XCode不能将类型为'Results?.Type'的值分配为类型为'Results?'。

有什么想法吗?

谢谢大家的光临!

1 个答案:

答案 0 :(得分:0)

所以问题是您想重新使用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

然后,在更下方的位置,我们有了填充表格视图的表格视图委托方法

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委托方法中的逻辑将知道从哪个dataSource数组获取数据。

重要的是要记住,领域结果是同质的,因此它们只能存储一种类型的对象。

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