我在代碼中遇到了一個問題,我是個新手,所以我在邊學邊做(所以請寬心!)。基本上,我有一個tableView,當用戶添加資料時顯示資料。例如,一個用戶在多個日子里添加了他的體重,并顯示出來。我發現,如果我用一個結構來表示 "Log",它只能顯示一個tableview單元格中的一個資料。但是,當我用類來表示 "日志 "時,它就會顯示所有的資料。一般情況下是這樣的嗎?我最初把表視圖的代碼寫成 "類Log",但需要把它改成一個結構,我就遇到了這個問題。我希望這段代碼容易閱讀! 誰能讓我知道如何改進我的代碼/給我一些指導?謝謝你!
VC
struct Log {
var title: String[/span]。
var Diary: [Diary] 。
init(title: String, Diary: [Diary]) {
self.title = title
self.Diary = Diary
}
}
struct Diary {
var id: String?
var Weight:
var Body: String
var date: String?
var dateFormatted: Date?
init(id: String? = nil, Weight: String, Body: String, date: String? = nil, dateFormatted: Date? = nil) {
self.id = id
self.Weight = Weight
self.Body = Body
self.date = date
self.dateFormatted = dateFormatted
}
}
@IBOutlet weak var logList: UITableView!
@IBOutlet 弱 var logTitle: UILabel!
var Diary = [Diary] ()
var Logs: [Log] = [Log].init()
override func viewDidLoad() {
super.viewDidLoad()
self.fetchData(for: todayDate)
}
獲取資料
func fetchData(for date。String) {
guard let userId = Auth. auth().currentUser?.uid else { return }。
let LogRef = Database. database().reference().child("users/(userId)/Log")
LogRef.removeAllObservers()
databaseRef = LogRef.child(date)
databaseRef.observe(.value, with: {(snapshot) in
self.Diary.removeAll()
self.Logs.removeAll()
if snapshot.childrenCount>0 {
for title in snapshot.children.allObjects as! [DataSnapshot] {
print("title ="/span>, title)
if let logObject = title.value as? [String: AnyObject]。
let title = logObject["Body"] as? String,
let Weight = logObject["weight"] as?
let title = Diary(id: title.key, Body: Body, Weight: Weight)
self.Diary.append(標題)。
if var Log = self.Logs.first(where: {$0.title == title}) {
Log.Diary.append(title)
}else {
self.Logs.append(Log.init(title: title, Diary: [title])
}
}else if title.key == "logTitle"/span>,
let logTitle = title.value as? String {
self.logTitle.text = logTitle
}
}
}
self.logList.reloadData()
})
}
表查看相關的代碼:
func numberOfSections(in tableView: UITableView) -> Int {
return self.Logs.count
}
func tableView(_ tableView。UITableView, titleForHeaderInSection section: Int) -> String? {
return self.Logs[section].title.upercased()
}
public func tableView(_ tableView。UITableView, numberOfRowsInSection section: Int) -> Int {
if self.hiddenSections.contains(section) {
return 0 {
}
return self.Logs[section].Diary.count
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = logList. dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! LogTableViewCell
let title: Diary = self.Logs【indexPath.section】.Diary【indexPath.row】。
cell.body.text = title.Body [indexPath.row]
cell.weight.text = title.Weight
returncell
}
}
uj5u.com熱心網友回復:
它主要歸結為這一行:
if var Log = self. Logs.first(where: {$0.title == title}) {
Log.Diary.append(title)
}
如果一個Log是一個類實體,那就會改變Log的Diary陣列在陣列self.Logs.
但是如果一個Log是一個結構體實體,它就不會。var Log是一個副本,并且改變它對self.Logs中的任何東西都沒有影響。
關于解決方法,請參閱我的https://stackoverflow.com/a/56916573/341994。正如我在那里所說:
當你有一個結構陣列時,為了對陣列中的一個結構進行更改,你必須通過索引來參考該結構。
所以
if let index = self. Logs.firstIndex(where: {$0.title == title}) {
self.Logs[index].Diary.append(title)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/311747.html
標籤:
