我要做的是当我的父母进入境界时访问一个孩子。在此示例中,我有一个简单的表视图,在访问父级时,我想在其中填充子级。我正在努力的部分是在尝试访问父母时试图找到孩子。
这是我试图访问子级的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。
如果您需要任何东西,请询问。谢谢
答案 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
}