gpt4 book ai didi

ios - 带有单元格的 UITableView 部分

转载 作者:行者123 更新时间:2023-11-29 06:01:38 25 4
gpt4 key购买 nike

我正在尝试制作类似 this 的东西但我无法将日期添加到我的表格 View 中。我有一个包含日期(Date)、名称(String)和数字(Int)的 Realm 数据库。

我已成功将日期添加到每个部分,但我无法找出如何将名称和数字添加到单元格。有多个行具有相同的日期,但具有不同的名称和数字。

到目前为止,这是我的代码:

import UIKit
import RealmSwift

class myViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!

var data:Results<Objects>!
var result:[Objects] = []

let cellSpacingHeight: CGFloat = 5

override func viewDidLoad() {
super.viewDidLoad()

tableView.delegate = self
tableView.dataSource = self

retreiveData()
}

func retreiveData() {
let realm = try! Realm()

// Retreive data
self.data = realm.objects(Objects.self).sorted(byKeyPath: "date",ascending: false)
self.result = Array(self.data)

print(result)

tableView.reloadData()
}

// MARK: - Table View delegate methods

func numberOfSections(in tableView: UITableView) -> Int {
return self.result.count
}

// Set the spacing between sections
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return cellSpacingHeight
}

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

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

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


let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEEE - dd.MM.yyyy"

let stringGivenDate = dateFormatter.string(from: result[indexPath.section].date!)

cell.textLabel?.text = "\(stringGivenDate)"
cell.detailTextLabel?.text = "\(result[indexPath.section].name!)"

return cell
}
}

最佳答案

您需要做的是按日期对数据进行分组

let grouped: [Data: [Objects]]!

//...
self.result = Array(self.data)
grouped = Dictionary(grouping: result) { (element) -> Date in
return element.date
}

这将生成一个字典,将具有相同日期的所有元素分组。现在,您可能需要做一些额外的决策,例如,仅按月份和年份对它们进行分组。

一旦你有了这个,你基本上就拥有了表的结构(部分是字典键和键后面的行数据。

为了让人信服,我可能还包括...

sections = grouped.keys.sorted()

可以更快地按指定顺序访问 key 。

然后您只需将适当的数据应用于您的委托(delegate)...

  func numberOfSections(in tableView: UITableView) -> Int {
return sections.count
}

// Set the spacing between sections
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return cellSpacingHeight
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return grouped[sections[section]]!.count
}

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

let rows = grouped[sections[indexPath.section]]!
let row = rows[indexPath.row]

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEEE - dd.MM.yyyy"

let stringGivenDate = dateFormatter.string(from: row.date!)

cell.textLabel?.text = "\(stringGivenDate)"
cell.detailTextLabel?.text = "\(row.name!)"

return cell
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let date = sections[section]

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEEE - dd.MM.yyyy"

return dateFormatter.string(from: date)
}

顺便说一句,DateFormatter 很昂贵,因此您可以考虑将其设为实例属性

可运行的示例......

Example

//
// ViewController.swift
// QuickTest
//
// Created by Shane Whitehead on 10/2/19.
// Copyright © 2019 Swann Communications. All rights reserved.
//

import UIKit

struct Stuff: CustomDebugStringConvertible {
let date: Date
let name: String

var debugDescription: String {
return "\(date) = \(name)"
}
}

extension Date {
static func random(daysBack: Int)-> Date {
let day = arc4random_uniform(UInt32(daysBack))+1
let hour = arc4random_uniform(23)
let minute = arc4random_uniform(59)

let today = Date(timeIntervalSinceNow: 0)
let calendar = Calendar.current
var offsetComponents = DateComponents()
offsetComponents.day = -Int(day)
offsetComponents.hour = Int(hour)
offsetComponents.minute = Int(minute)

let randomDate = calendar.date(byAdding: offsetComponents, to: today)
return randomDate!
}

var startOfDay: Date {
let calendar = Calendar.current
return calendar.startOfDay(for: self)
}
}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!

let cellSpacingHeight: CGFloat = 5

var grouped: [Date: [Stuff]] = [:]
var sections: [Date] = []

var headerDateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM yyyy"
return dateFormatter
}()

var cellDateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEEE - dd.MM.yyyy"
return dateFormatter
}()

override func viewDidLoad() {
super.viewDidLoad()

retreiveData()

tableView.delegate = self
tableView.dataSource = self

tableView.rowHeight = UITableView.automaticDimension
tableView.sectionHeaderHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = 44
tableView.estimatedSectionHeaderHeight = 44

tableView.reloadData()
}

func retreiveData() {
var data: [Stuff] = []
for index in 0..<100 {
let stuff = Stuff(date: Date.random(daysBack: 10), name: "\(index)")
data.append(stuff)
}

grouped = Dictionary(grouping: data) { (element) -> Date in
return element.date.startOfDay
}
sections = grouped.keys.sorted()

}

// MARK: - Table View delegate methods

func numberOfSections(in tableView: UITableView) -> Int {
return grouped.count
}

// Set the spacing between sections
// func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
// return cellSpacingHeight
// }

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

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return grouped[sections[section]]!.count
}

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

let rows = grouped[sections[indexPath.section]]!
let row = rows[indexPath.row]

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEEE - dd.MM.yyyy"

let stringGivenDate = dateFormatter.string(from: row.date)

cell.textLabel?.text = "\(stringGivenDate)"
cell.detailTextLabel?.text = "\(row.name)"

return cell
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let date = sections[section]
return headerDateFormatter.string(from: date)
}
}

关于ios - 带有单元格的 UITableView 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54611403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com