Ios 为什么在和嵌入式tableView中显示领域数据并不容易?
无法在嵌入视图控制器的表视图中显示来自领域的数据。这里有一些代码 处理数据存储方案的数据模型类(这是一个财务跟踪应用程序):Ios 为什么在和嵌入式tableView中显示领域数据并不容易?,ios,swift,uitableview,realm,Ios,Swift,Uitableview,Realm,无法在嵌入视图控制器的表视图中显示来自领域的数据。这里有一些代码 处理数据存储方案的数据模型类(这是一个财务跟踪应用程序): class Entry: Object { @objc dynamic var name: String = "" @objc dynamic var amount: Int = 0 @objc dynamic var date: Date? var isExpense: Bool = false // initializatio
class Entry: Object {
@objc dynamic var name: String = ""
@objc dynamic var amount: Int = 0
@objc dynamic var date: Date?
var isExpense: Bool = false
// initialization block dropped for concise post purposes
}
class FinanceOverviewCell: UITableViewCell {
@IBOutlet weak var entryNameLabel: UILabel!
@IBOutlet weak var entryAmountLabel: UILabel!
func updateData(name: String, amount: String) {
entryNameLabel?.text = name
entryAmountLabel?.text = amount
}
}
import UIKit
import RealmSwift
class FinanceOverviewController: UIViewController {
@IBOutlet weak var financeOverviewTableView: UITableView!
@IBOutlet weak var currentBalanceLabel: UILabel!
var realm = try! Realm()
let tableEntries = try! Realm().objects(Entry.self)
let entriesManager = EntriesManager()
var notificationToken: NotificationToken?
override func viewDidLoad() {
super.viewDidLoad()
print(tableEntries)
self.financeOverviewTableView.reloadData()
financeOverviewTableView.delegate = self
financeOverviewTableView.dataSource = self
// notification token code block dropped for concise post purposes
// outlets code block removed for concise post purposes
extension FinanceOverviewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
realm.beginWrite()
realm.delete(tableEntries[indexPath.row])
try! realm.commitWrite()
}
}
}
extension FinanceOverviewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableEntries.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = financeOverviewTableView.dequeueReusableCell(withIdentifier: "FinanceOverviewCell", for: indexPath) as! FinanceOverviewCell
let tableData = tableEntries[indexPath.row]
cell.updateData(name: tableData.name, amount: String(tableData.amount))
return cell
}
}
单元类:
class Entry: Object {
@objc dynamic var name: String = ""
@objc dynamic var amount: Int = 0
@objc dynamic var date: Date?
var isExpense: Bool = false
// initialization block dropped for concise post purposes
}
class FinanceOverviewCell: UITableViewCell {
@IBOutlet weak var entryNameLabel: UILabel!
@IBOutlet weak var entryAmountLabel: UILabel!
func updateData(name: String, amount: String) {
entryNameLabel?.text = name
entryAmountLabel?.text = amount
}
}
import UIKit
import RealmSwift
class FinanceOverviewController: UIViewController {
@IBOutlet weak var financeOverviewTableView: UITableView!
@IBOutlet weak var currentBalanceLabel: UILabel!
var realm = try! Realm()
let tableEntries = try! Realm().objects(Entry.self)
let entriesManager = EntriesManager()
var notificationToken: NotificationToken?
override func viewDidLoad() {
super.viewDidLoad()
print(tableEntries)
self.financeOverviewTableView.reloadData()
financeOverviewTableView.delegate = self
financeOverviewTableView.dataSource = self
// notification token code block dropped for concise post purposes
// outlets code block removed for concise post purposes
extension FinanceOverviewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
realm.beginWrite()
realm.delete(tableEntries[indexPath.row])
try! realm.commitWrite()
}
}
}
extension FinanceOverviewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableEntries.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = financeOverviewTableView.dequeueReusableCell(withIdentifier: "FinanceOverviewCell", for: indexPath) as! FinanceOverviewCell
let tableData = tableEntries[indexPath.row]
cell.updateData(name: tableData.name, amount: String(tableData.amount))
return cell
}
}
最后,查看控制器:
class Entry: Object {
@objc dynamic var name: String = ""
@objc dynamic var amount: Int = 0
@objc dynamic var date: Date?
var isExpense: Bool = false
// initialization block dropped for concise post purposes
}
class FinanceOverviewCell: UITableViewCell {
@IBOutlet weak var entryNameLabel: UILabel!
@IBOutlet weak var entryAmountLabel: UILabel!
func updateData(name: String, amount: String) {
entryNameLabel?.text = name
entryAmountLabel?.text = amount
}
}
import UIKit
import RealmSwift
class FinanceOverviewController: UIViewController {
@IBOutlet weak var financeOverviewTableView: UITableView!
@IBOutlet weak var currentBalanceLabel: UILabel!
var realm = try! Realm()
let tableEntries = try! Realm().objects(Entry.self)
let entriesManager = EntriesManager()
var notificationToken: NotificationToken?
override func viewDidLoad() {
super.viewDidLoad()
print(tableEntries)
self.financeOverviewTableView.reloadData()
financeOverviewTableView.delegate = self
financeOverviewTableView.dataSource = self
// notification token code block dropped for concise post purposes
// outlets code block removed for concise post purposes
extension FinanceOverviewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
realm.beginWrite()
realm.delete(tableEntries[indexPath.row])
try! realm.commitWrite()
}
}
}
extension FinanceOverviewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableEntries.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = financeOverviewTableView.dequeueReusableCell(withIdentifier: "FinanceOverviewCell", for: indexPath) as! FinanceOverviewCell
let tableData = tableEntries[indexPath.row]
cell.updateData(name: tableData.name, amount: String(tableData.amount))
return cell
}
}
问题出现在视图控制器的cellForRowAtfunc中。不知何故,尽管tableData每次都保存一些适当的内容来添加行,但它只是不添加任何内容。在应用程序屏幕中,我看到了另一行占位符标签
可能是什么问题?我阅读了一些参考资料,也仔细查看了一下,但没有看到任何针对这个案例的特殊解决方案
感谢您的支持。事实上,使用Realm并不困难,我试图复制您的代码,一切正常。我认为它与NotificationToken有关,因为每次更改集合时,NotificationToken都会运行一段代码,我不知道如何更新tableView。我建议您使用此扩展,我已经使用了几个月,这是通过Realm的NotificationToken采用UITableView的最佳方式:
extension UITableView {
func applyChanges<T>(changes: RealmCollectionChange<T>) {
switch changes {
case .initial: reloadData()
case .update(let results, let deletions, let insertions, let updates):
let fromRow = { (row: Int) in return IndexPath(row: row, section: 0) }
beginUpdates()
insertRows(at: insertions.map(fromRow), with: .automatic)
reloadRows(at: updates.map(fromRow), with: .automatic)
deleteRows(at: deletions.map(fromRow), with: .automatic)
endUpdates()
case .error(let error): fatalError("\(error)")
}
}
}
来源:请分享您的
cell.updateData()代码。
@koen它就在cell类中的单元格出口之后。是的,我现在看到了,谢谢。那么这个方法是用有效数据调用的?您的标签在故事板中连接了吗?@koen是的,调用此方法,然后传递两条数据:条目数量和名称。后两个来源于一系列未解释的条目。那么出口呢?