我有一个Transaction对象数组:
var transactions = [Transaction]()
交易类:
class Transaction {
var description : String = ""
var post_transaction_balance : Double = 0
var settlement_date : NSDate?
var dateOnly : NSDate?
}
我需要创建一个带有节的UITableView,每个节表示在特定日期进行的交易
表结构应如何显示的示例:
- 节标题:dateOnly -
交易[0]标题
交易[3]标题
- 节标题:dateOnly -
交易[2]标题
交易[7]标题
dateOnly值的示例:
dateOnly = (NSDate?) 2016-01-22 00:00:00 UTC
我不确定如何遍历对象数组并将数据放入节标题和单元格中。我非常感谢任何帮助。
答案 0 :(得分:4)
预览结果:
注意:我使用过Swift 3。
<强>的ViewController:强>
class ViewController: UIViewController {
@IBOutlet weak private var tableView: UITableView!
var transactionsGroupedByDate = [(String,Array<Transaction>)]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
getTransactions()
}
// Getting transactions
private func getTransactions() {
let transactions = makeTransactions()
self.transactionsGroupedByDate = groupByDate(transactions: transactions)
tableView.reloadData()
}
// Grouping the transactions by their date
private func groupByDate(transactions: [Transaction]) -> [(String,Array<Transaction>)] {
var transactionsGroupedByDate = Dictionary<String, Array<Transaction>>()
// Looping the Array of transactions
for transaction in transactions {
// Converting the transaction's date to String
let date = convertDateToString(date: transaction.date!)
// Verifying if the array is nil for the current date used as a
// key in the dictionary, if so the array is initialized only once
if transactionsGroupedByDate[date] == nil {
transactionsGroupedByDate[date] = Array<Transaction>()
}
// Adding the transaction in the dictionary to the key that is the date
transactionsGroupedByDate[date]?.append(transaction)
}
// Sorting the dictionary to descending order and the result will be
// an array of tuples with key(String) and value(Array<Transaction>)
return transactionsGroupedByDate.sorted { $0.0 > $1.0 }
}
}
帮助方法:
extension ViewController {
// Helper to create a date formatter
func createDateFormatter() -> DateFormatter {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = TimeZone(identifier: "UTC")
return dateFormatter
}
// Helper to convert date to string
func convertDateToString(date: Date) -> String {
let dateFormatter = createDateFormatter()
return dateFormatter.string(from: date)
}
// Mocking the transactions
func makeTransactions() -> [Transaction] {
var transactions = [Transaction]()
let dateFormatter = createDateFormatter()
let date1 = dateFormatter.date(from: "2016-01-22 00:00:00")
let transaction1 = Transaction(title: "transaction 1", date: date1)
let date2 = dateFormatter.date(from: "2016-01-22 00:00:00")
let transaction2 = Transaction(title: "transaction 2", date: date2)
let date3 = dateFormatter.date(from: "2016-01-23 00:00:00")
let transaction3 = Transaction(title: "transaction 3", date: date3)
let date4 = dateFormatter.date(from: "2016-01-24 00:00:00")
let transaction4 = Transaction(title: "transaction 4", date: date4)
let date5 = dateFormatter.date(from: "2016-01-24 00:00:00")
let transaction5 = Transaction(title: "transaction 5", date: date5)
let date6 = dateFormatter.date(from: "2016-01-25 00:00:00")
let transaction6 = Transaction(title: "transaction 6", date: date6)
transactions.append(transaction1)
transactions.append(transaction2)
transactions.append(transaction3)
transactions.append(transaction4)
transactions.append(transaction5)
transactions.append(transaction6)
return transactions
}
}
UITableViewDelegate,UITableViewDataSource方法:
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return transactionsGroupedByDate[section].1.count
}
func numberOfSections(in tableView: UITableView) -> Int {
return transactionsGroupedByDate.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return transactionsGroupedByDate[section].0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let transaction = transactionsGroupedByDate[indexPath.section].1[indexPath.row]
cell.textLabel?.text = transaction.title
return cell
}
}
交易结构:
struct Transaction {
var title: String?
var date: Date?
}
答案 1 :(得分:0)
为什么不将数组重组为字典。
您可以枚举事务数组并将其另存为[String:Transaction]。关键可能是你特定日子的描述。
答案 2 :(得分:0)
你需要有一个section
数组(即[Int:NSDate]
),其中包含每个部分的起始索引&amp;每个部分的日期值(部分标题)。
您可以定义填充section数组的func
,并可以在其中执行以下操作:
根据其中的transactions
个对象重新排序dateOnly
数组,以便最接近日期的Transaction
对象位于顶部。
迭代排序后的数组,找到与数组中前一个对象不同的dateOnly
个对象,并将这些dateOnly
个对象放在section数组中。
现在,您有一个section
数组,其中包含dateOnly
个对象和一个已排序的Transaction
数组。您可以轻松地使用这些来填充tableView
。