Как получить ребенка от родителя в родительских дочерних отношениях для царства в swift - PullRequest
0 голосов
/ 08 декабря 2018

Что я пытаюсь сделать, так это получить доступ к ребенку, когда у меня есть родитель в сфере.В этом примере у меня есть простое табличное представление, которое я хочу заполнить дочерним при доступе к родительскому.Часть, с которой я борюсь, пытается найти ребенка при доступе к родителю.

Это 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 голосов
/ 09 декабря 2018

Позвольте мне рассмотреть это на высоком уровне с помощью нескольких фрагментов кода.Вопрос заключается в использовании объектов, поэтому давайте рассмотрим более конкретный пример Person и Dog.В этом примере у нас есть список объектов Person, каждый из которых владеет одной собакой.Таким образом, мы имеем однонаправленное отношение

Сначала у нас есть класс Person и 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, которые заполняют наше представление таблицы и обрабатывают нажатие на строку

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

    }
0 голосов
/ 09 декабря 2018

Я думаю, что что-то получил.Я подумал, что мне нужен был массив, и кажется, что неразумно менять List на Array, поэтому я получил содержимое из List и поместил его в массив, так как легче помещать данные втабличное представление из массива.

Это массив, который я создал:

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
    }

Я не уверен, если этоэто нормально, но это единственное, что я могу придумать.Спасибо за всю помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...