UITableView中按月显示的部分

时间:2015-11-09 16:10:22

标签: ios swift uitableview

我创建了一个显示我的阵列的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
    }

1 个答案:

答案 0 :(得分:0)

问题在于您的数据模型(self.historic.performances)过于简单。您需要节和行,但您的数据模型仅表示行。您将需要一个数据模型,将您的表演结构化为多个部分。一种典型的方法是使用数组数组 - 每个外部数组都是一个部分,每个内部数组是该部分的行 。但当然许多其他方法都是可能的。