我创建了一个显示我的阵列的tableView,这是我演出的历史。 我希望逐月“分组”那些表演,在我的阵列中,我得到了每个表演的创作日期。
但我对如何继续下去感到遗憾。这是我的tableview的代码。
var historic: Historic!
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.historic == nil {
return 0
}
return self.historic.performances.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("HistoricTableViewCellOne", forIndexPath: indexPath) as! HistoricTableViewCell
// Configure the cell...
if self.historic != nil {
let perf = self.historic.performances[indexPath.row]
cell.configureWithPerformance(perf)
}
return cell
}
这是我的对象
class Historic: NSObject {
var totalDistance: CLLocationDistance = 0.0
var performances: [Performance] = [Performance]()
override init() {
super.init()
}
}
class Performance: NSObject {
var urlCover: NSURL
var duration: Double = 0
var length: Double = 0
var id: UInt = 0
var publicationStatus: PerformancePublicationStatus?
var creationDate: NSDate?
init(urlCover: NSURL, creationDate: NSDate){
self.urlCover = urlCover
self.creationDate = creationDate
}
}
最终编辑: 它正在运作!我把这些代码放在这里以防有人感兴趣。
var perfSections = [String]()
var tableViewCellsForSection = [Performance]()
var perfCells = Dictionary<String, [Performance]>()
// MARK: - Setup Data Source
private func setupDataSource() {
var calendar = NSCalendar.currentCalendar()
var dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale.currentLocale()
dateFormatter.timeZone = calendar.timeZone
dateFormatter.setLocalizedDateFormatFromTemplate("MMMM YYYY")
let dateComponents: NSCalendarUnit = .CalendarUnitYear | .CalendarUnitMonth
var previousYear: Int = -1
var previousMonth: Int = -1
for performance in historic.performances {
var components: NSDateComponents = calendar.components(dateComponents, fromDate: performance.creationDate!)
var year: Int = components.year
var month: Int = components.month
if (year == previousYear && month == previousMonth) {
self.tableViewCellsForSection.append(performance)
previousYear = year
previousMonth = month
}
if (year != previousYear || month != previousMonth) {
if !self.tableViewCellsForSection.isEmpty {
var sectionHeading: String = dateFormatter.stringFromDate(self.tableViewCellsForSection.last!.creationDate!)
self.perfSections.append(sectionHeading)
self.perfCells[sectionHeading] = self.tableViewCellsForSection
self.tableViewCellsForSection = []
}
self.tableViewCellsForSection.append(performance)
previousYear = year
previousMonth = month
}
}
var sectionHeading: String = dateFormatter.stringFromDate(self.tableViewCellsForSection.last!.creationDate!)
self.perfSections.append(sectionHeading)
self.perfCells[sectionHeading] = self.tableViewCellsForSection
self.tableViewCellsForSection = []
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return self.perfSections.count
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.historic == nil {
return 0
}
var key = self.perfSections[section]
self.tableViewCellsForSection = self.perfCells[key]!
return self.tableViewCellsForSection.count
}
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return self.perfSections[section]
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("HistoricTableViewCellOne", forIndexPath: indexPath) as! HistoricTableViewCell
// Configure the cell...
if self.historic != nil {
var key = self.perfSections[indexPath.section]
self.tableViewCellsForSection = self.perfCells[key]!
let perf = self.tableViewCellsForSection[indexPath.row]
cell.configureWithPerformance(perf)
}
return cell
}
答案 0 :(得分:0)
问题在于您的数据模型(self.historic.performances
)过于简单。您需要节和行,但您的数据模型仅表示行。您将需要一个数据模型,将您的表演结构化为多个部分。一种典型的方法是使用数组数组 - 每个外部数组都是一个部分,每个内部数组是该部分的行 。但当然许多其他方法都是可能的。