如何获取与集合相关的信息从xml文件中查看选定的单元格,然后打印到表格视图?



我使用 JTAppleCalendar 依赖项构建了一个日历(它是一个集合视图(,并且在同一屏幕底部有一个表格视图。我想在日历中选择一个日期,然后在 xml 文件中查找该日期,并在 tableView 中打印其随附的假日事件。

我正在使用 XML 解析器来获取日期和假日事件,我可以解析 xml 数据并将其打印到我的控制台。目前,整个xml文件正在表格视图中打印,但我只想打印从日历视图中选择的日期。我在思考如何使所选日期等于 xml 日期,然后仅将其打印到表视图中时感到困惑,并且需要有关此步骤的一些帮助。

这是我的日历视图控制器的完整代码:

import UIKit
import JTAppleCalendar
class CalendarViewController: UIViewController, XMLParserDelegate {
@IBOutlet weak var calendarView: JTAppleCalendarView!
@IBOutlet weak var year: UILabel!
@IBOutlet weak var month: UILabel!
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var separatorViewTopConstraing: NSLayoutConstraint!
let outsideMonthColor = UIColor.cyan
let monthColor = UIColor.white
let selectedMonthColor = UIColor.darkGray
let currentDateSelectedViewColor = #colorLiteral(red: 0.3647058904, green: 0.06666667014, blue: 0.9686274529, alpha: 1)
let todaysDefaultDateColor  = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
let formatter = DateFormatter()
let todaysDate = Date()
let numOfRowsInCalendar = 6
var tableViewDataSource = [CalendarDates]()
var calendarevent = ""
var monthTableview = ""
var dateTableview = ""
var datenumberTableview = ""
var holidayTableview = ""
var descriptionTableview = ""
override func viewDidLoad() {
super.viewDidLoad()
setupCalendarViewAtStart()
setUpTableViewAtStart()
setUpBackgroundView()
self.navigationController?.navigationBar.isTranslucent = true
}
//Mark: Calendar View JTApple code
func setupCalendarViewAtStart(){
//Scroll to today's date at start
calendarView.scrollToDate(todaysDate, animateScroll:false)
calendarView.selectDates([todaysDate])
//Setup calendar spacing
calendarView.minimumLineSpacing = 0
calendarView.minimumInteritemSpacing = 0
//Setup labels
self.calendarView.visibleDates { visibleDates in
self.setupViewsOfCalendar(from: visibleDates)
}
self.adjustCalendarViewHeight()
}
func handleCellTextColor(view: JTAppleCell?, cellState: CellState) {
guard let validCell = view as? CalendarCell else { return }
if cellState.isSelected {
validCell.dateLabel.textColor = currentDateSelectedViewColor
} else {
if cellState.dateBelongsTo == .thisMonth {
validCell.dateLabel.textColor = monthColor
} else {
validCell.dateLabel.textColor = outsideMonthColor
}
validCell.isHidden = cellState.dateBelongsTo == .thisMonth ? false : true
}
//today's date selection
formatter.dateFormat = "yyyy MM dd"
let todaysDateString = formatter.string(from: todaysDate)
let monthDateString = formatter.string(from: cellState.date)
if todaysDateString == monthDateString {
validCell.dateLabel.textColor = todaysDefaultDateColor
validCell.dateLabel.font = UIFont.systemFont(ofSize: 30.0)
} else {
validCell.dateLabel.textColor = monthColor
validCell.dateLabel.font = UIFont.systemFont(ofSize: 18.0)
}
}
func handleCellSelected(view: JTAppleCell?, cellState: CellState) {
guard let validCell = view as? CalendarCell else { return }
if validCell.isSelected {
validCell.selectedView.isHidden = false
} else {
validCell.selectedView.isHidden = true
}
}
func setupViewsOfCalendar(from visibleDates: DateSegmentInfo) {
let date = visibleDates.monthDates.first!.date
self.formatter.dateFormat = "yyyy"
self.year.text = self.formatter.string(from: date)
self.formatter.dateFormat = "MMMM"
self.month.text = self.formatter.string(from: date)
}
//Mark: TableView setup
func setUpTableViewAtStart() {
tableView.dataSource = self
tableView.delegate = self
self.tableView.bounces = true
if let path = Bundle.main.url(forResource: "calendar", withExtension: "xml")
{
if let parser = XMLParser(contentsOf: path) {
parser.delegate = self
parser.parse()
}
}
}
}
//Mark: JTAppleCalendarViewDataSource
extension CalendarViewController: JTAppleCalendarViewDataSource {
func configureCalendar(_ calendar: JTAppleCalendarView) -> ConfigurationParameters {
formatter.dateFormat = "yyyy MM dd"
formatter.timeZone = Calendar.current.timeZone
formatter.locale = Calendar.current.locale
let startDate = formatter.date(from: "2018 08 01")!
let endDate = formatter.date(from: "2019 01 31")!
let parameters = ConfigurationParameters(startDate: startDate,
endDate: endDate,
numberOfRows: numOfRowsInCalendar)
return parameters
}
}
//Mark: JTAppleCalendarViewDelegate
extension CalendarViewController: JTAppleCalendarViewDelegate {
func calendar(_ calendar: JTAppleCalendarView, willDisplay cell: JTAppleCell, forItemAt date: Date, cellState: CellState, indexPath: IndexPath) {
}
//Display the cell
func calendar(_ calendar: JTAppleCalendarView, cellForItemAt date: Date, cellState: CellState, indexPath: IndexPath) -> JTAppleCell {
let cell = calendar.dequeueReusableJTAppleCell(withReuseIdentifier: "CalendarCell", for: indexPath) as! CalendarCell
cell.dateLabel.text = cellState.text
handleCellSelected(view: cell, cellState: cellState)
handleCellTextColor(view: cell, cellState: cellState)
return cell
}
func calendar(_ calendar: JTAppleCalendarView, didSelectDate date: Date, cell: JTAppleCell?, cellState: CellState) {
handleCellSelected(view: cell, cellState: cellState)
handleCellTextColor(view: cell, cellState: cellState)
}
func calendar(_ calendar: JTAppleCalendarView, didDeselectDate date: Date, cell: JTAppleCell?, cellState: CellState) {
handleCellSelected(view: cell, cellState: cellState)
handleCellTextColor(view: cell, cellState: cellState)
}
}
//Mark: TableView Delegate/DataSource for Date and Holiday Names
extension CalendarViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return dateTableview.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "(dateTableview)"
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableViewDataSource.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CalendarDateEvent", for: indexPath)
let holidayTableviewLabel = cell.viewWithTag(3) as! UILabel
holidayTableviewLabel.text = tableViewDataSource[indexPath.row].holiday
let dataTableviewLabel = cell.viewWithTag(2) as! UILabel
dataTableviewLabel.text = tableViewDataSource[indexPath.row].datenumber
return cell
}
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
let header = view as! UITableViewHeaderFooterView
header.textLabel?.font = UIFont.systemFont(ofSize: 16.0)
header.textLabel?.textColor = #colorLiteral(red: 0.2773199975, green: 0.3366781473, blue: 0.3707436919, alpha: 1)
header.backgroundView?.backgroundColor = UIColor.white
tableView.layer.cornerRadius = 20
tableView.layer.masksToBounds = true
}
}
//Mark: XML Parse Delegate
extension CalendarViewController {
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
calendarevent = elementName
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
let data = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
if data.count != 0 {
switch calendarevent
{
case "month": monthTableview = data
case "date": dateTableview = data
case "datenumber": datenumberTableview = data
case "holiday": holidayTableview = data
default: break
}
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "calendarevent"
{
var myCalendarDates = CalendarDates()
myCalendarDates.month = monthTableview
myCalendarDates.date = dateTableview
myCalendarDates.datenumber = datenumberTableview
myCalendarDates.holiday = holidayTableview
//print(myCalendarDates)
tableViewDataSource.append(myCalendarDates)
}
}
}

这是我的日历结构:

struct CalendarDates {
var month = ""
var date = ""
var datenumber = ""
var holiday = ""
var description = "" }

我的 XML 文件的结构如下:

< ?xml version="1.0" encoding="UTF-8" ?>
< calendar>
< calendarmonth id= "August">
< calendarevent>
< month>August</month>
< date>August 20, 2018</date>
< datenumber>20</datenumber>
< event>
< holiday>First Holiday</holiday>
< /event>
< event>
< holiday>Second Holiday</holiday>
< /event>
</calendarevent>
<calendarevent>
<month>August</month>
<date>August 26, 2018</date>
<datenumber>26</datenumber>
<event>
<holiday>Third Holiday</holiday>
<description>ccccccccccc</description>
</event>
</calendarevent>
< /calendarmonth>
< /calendar>

您可以按照以下步骤操作:

步骤1:在此函数中,您将获得用户从日历中选择的日期。

func calendar(_ calendar: JTAppleCalendarView, didSelectDate date: Date, cell: JTAppleCell?, cellState: CellState) { ... }

第 2 步:编写一个逻辑,该逻辑将找出与您的 XML 结果匹配的数据。

func findOutResult(matchesToDate date: Date) -> [Result] {...}

步骤3:重新加载表,它应该显示所需的结果。

由于您已经编写了日历、表格视图的逻辑,因此对您来说应该很容易。

相关内容

最新更新