我正在尝试制作类似this的内容,但是在将日期添加到表视图时遇到了麻烦。我有一个带日期(Date),名称(String)和数字(Int)的领域数据库。
我已经成功地在每个部分添加了日期,但是我很难找到如何在单元格中添加名称和数字。有多个具有相同日期但名称和数字不同的行。
到目前为止,这是我的代码:
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
}
}
答案 0 :(得分:0)
您可以使用这两个预定义功能。
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "Section \(section)"
}
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
vw.backgroundColor = UIColor.grey
return view
}
答案 1 :(得分:0)
您需要做的是按日期对数据进行分组
let grouped: [Data: [Objects]]!
//...
self.result = Array(self.data)
grouped = Dictionary(grouping: result) { (element) -> Date in
return element.date
}
这将产生一个字典,将所有元素分组为相同的Date
。现在,您可能需要执行一些其他决策,例如,仅按月和年分组。
有了这个,您就基本上有了表的结构(各部分是字典键和键后面的行数据。
为了说服,我可能还会包括...
sections = grouped.keys.sorted()
可以更快地按指定顺序访问密钥。
然后,您只需要将适当的数据应用于您的代表...
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
非常昂贵,因此您可以考虑将其设置为实例属性
//
// 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)
}
}