如何在亲子关系中从父母那里获得孩子以快速进入领域

时间:2018-12-08 04:19:49

标签: ios swift uitableview realm

我要做的是当我的父母进入境界时访问一个孩子。在此示例中,我有一个简单的表视图,在访问父级时,我想在其中填充子级。我正在努力的部分是在尝试访问父母时试图找到孩子。

这是我试图访问子级的viewController:

import UIKit
import Realm
import RealmSwift

class OtherViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var otherTableView: UITableView!

    var realm: Realm!
    var realmedData = ""

    var realmList: Results<Realmed> {
        get {
            return realm.objects(Realmed.self)
        }
    }


    var realmTwoList: Results<RealmTwo> {
        get {
            return realm.objects(RealmTwo.self)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        realm = try! Realm()
        self.otherTableView.delegate = self
        self.otherTableView.dataSource = self
        // Do any additional setup after loading the view.
    }


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        var counted = realm.objects(RealmTwo.self).filter("realmLbl == %@", realmedData)
        return counted.count

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "otherCell", for: indexPath) as! OtherTableViewCell

        var celledItem = realm.objects(Realmed.self)
        for item in celledItem {
            for items in item.realmTwo {
                cell.otherLbl.text = "\(items.spanish)"
            }
        }
        return cell
    }

}

这是我在以下位置为行单元格尝试的另一种方法:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "otherCell", for: indexPath) as! OtherTableViewCell

    var celledItem = realm.objects(Realmed.self)
    for item in celledItem {
        for items in item.realmTwo {
            cell.otherLbl.text = "\(items.spanish)"
        }
    }
    return cell
}

这是父领域类:

import Foundation
import Realm
import RealmSwift

class Realmed: Object {
    @objc dynamic var label = ""
    @objc dynamic var romanNum = ""
    @objc dynamic var txt = ""
    let realmTwo = List<RealmTwo>()

    override static func primaryKey() -> String {
        return "label"
    }


    convenience init(label: String, romanNum: String, txt: String) {
        self.init()
        self.label = label
        self.romanNum = romanNum
        self.txt = txt
    }

}

这是孩子的领域类:

import Foundation
import UIKit
import Realm
import RealmSwift

class RealmTwo: Object {
    @objc dynamic var realmLbl = String()
    @objc dynamic var spanish = String()
    @objc dynamic var french = String()
    let realmed = LinkingObjects(fromType: Realmed.self, property: "realmTwo")



    convenience init(realmLbl: String, spanish: String, french: String) {
        self.init()
        self.realmLbl = realmLbl
        self.spanish = spanish
        self.french = french
    }

}

按原样运行时,填充表视图的唯一内容是保存到领域的最后一个值。 在此示例中,孩子是字符串:“ Uno”和“ Un”,我希望它们都填充tableView,但是tableView仅由领域中的最后一个值(在这种情况下为“ Un”)填充。 通过研究,我发现这是因为我正在遍历领域值来获取孩子。这样做的问题是到达子级的唯一方法是使用循环,但这样就无法填充tableView。这似乎是一种双输的情况。

我很好奇的是,当您有一个父母时,如何访问孩子,以便我能够填充tableView。

如果您需要任何东西,请询问。谢谢

2 个答案:

答案 0 :(得分:0)

我想我得到了一些东西。我认为我需要的是一个数组,将List更改为数组似乎是不明智的,所以我所做的就是从List中获取内容并将其放入数组中,因为将数据放入其中更容易数组中的tableview。

这是我创建的数组:

var realmArr = [String]()

这是tableView中行的单元格:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "otherCell", for: indexPath) as! OtherTableViewCell

    var celledItem = realm.objects(Realmed.self)
    for item in celledItem {
        for items in item.realmTwo {
            self.realmArr.append(items.spanish)
        }
    }

    cell.otherLbl.text = "\(realmArr[indexPath.row])"
    return cell
    }

我不确定这是否可以,但这是我唯一能想到的。 感谢您的所有帮助。

答案 1 :(得分:0)

让我用一些代码片段来概括地解决这个问题。问题是使用对象,因此让我们以“人与狗”为例。在此示例中,我们有一个“人物对象”列表,每个对象都拥有一只狗。所以我们有一个单向关系

首先我们有一个Person and Dog类

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

class PersonClass: Object {
    @objc dynamic var name: String = ""
    @objc dynamic var dog: DogClass?
}

这是一个viewController类,其中包含人的tableView

class peopleVC: NSViewController, NSTableViewDelegate, NSTableViewDataSource {
    var peopleResults: Results<PersonClass>!

    override func viewDidLoad() {
        super.viewDidLoad()
        let realm = RealmService //or however you talk to your realm
        self.tableView.delegate = self
        self.tableView.dataSource = self
        self.peopleResults = realm.objects(PersonClass.self) //loads Person objects
        self.tableView.reloadData() //shows the list
    }

在该类中,tableView委托方法填充了我们的tableview并处理了对行的点击

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return peopleResults.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: textCellIdentifier, for: indexPath as IndexPath)

    let row = indexPath.row
    let person = self.peopleResults[row]
    cell.textLabel?.text = person.name

    return cell
}

   //when a row is tapped we need to determine the row, which will be included
   // in the indexPath property with indexPath.row
   // From there get the object from the dataSource array via it's row index
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let row = indexPath.row
        let person = self.peopleResults[row]
        let dog = person.dog

        //at this point you have the dog object and you could print the name
        print(dog.name)

       //or pass it to a detail view via a segue etc

    }