更新基于web服务实现的行标签swift

星期一,星期二,星期天,我有一个7行的表格视图。 我的应用程序接收来自Web服务的json格式为:

({ appointments = ( { numApts = 1; scheduleDate = "2015-11-02"; }, { numApts = 2; scheduleDate = "2015-11-04"; } ); }) 

所以我试图通过JSON响应循环,并更新我们的工作日的标签,如果它匹配收到的JSONdate。

不知道如何实现这一点。 我需要一个模型class吗? 就像是:

 import UIKit class CurrentRosterModel { var numApts : String? var scheduleDate : String? init(json : NSDictionary){ self.numApts = json["numApts"] as? String self.scheduleDate = json["scheduleDate"] as? String } } 

我今天正在尝试的是更新行文本的函数,但是如果让条件访问单元格来更新标签,我还没有进入最后一步。

  let weekDateDict = ["Monday" : mon, "Tuesday" : tues, "Wednesday" : wedns, "Thursday" : thurs, "Friday" : fri, "Saturday" : sat, "Sunday" : sun] //where vars mon = "2015-11-02", tues = "2015-11-03" etc. //aptsArray is hard coded for now but will need to come from a web service response later let aptsArray : [Dictionary<String, String>] = [ [ "numApts" : "1", "scheduleDate" : "2015-11-02" ], [ "numApts" : "2", "scheduleDate" : "2015-11-04" ]]; for (weekDay, weekDate) in weekDateDict { if aptsArray.contains({ $0.values.contains(weekDate)}) { print("Matched with weekDate is \(weekDate) and weekDay is \(weekDay)") //getting this condition twice as expected let ourIndexPath : NSIndexPath? switch weekDay { case "Monday": ourIndexPath = NSIndexPath(forRow: 0, inSection : 0) //print("Monday label update") case "Tuesday": ourIndexPath = NSIndexPath(forRow: 1, inSection : 0) //print("Tuesday label update") case "Wednesday": ourIndexPath = NSIndexPath(forRow: 2, inSection : 0) //print("Wednesday label update") case "Thursday": ourIndexPath = NSIndexPath(forRow: 3, inSection : 0) //print("Thursday label update") case "Friday": ourIndexPath = NSIndexPath(forRow: 4, inSection : 0) //print("Friday label update") case "Saturday": ourIndexPath = NSIndexPath(forRow: 5, inSection : 0) //print("Saturday label update") case "Sunday": ourIndexPath = NSIndexPath(forRow: 6, inSection : 0) //print("Sunday label update") default : ourIndexPath = NSIndexPath(forRow: 7, inSection : 0) //print("swicth not satisfied") } if let cell = weekTableView.cellForRowAtIndexPath(ourIndexPath!) as? WeekDayCell{ print("got in here")//not getting in here cell.numAptsLbl.text = aptsArray[0]["numApts"]! weekTableView.beginUpdates() weekTableView.reloadRowsAtIndexPaths([ourIndexPath!], withRowAnimation: UITableViewRowAnimation.Automatic) weekTableView.endUpdates() } } 

我的tableview方法如下所示:

 func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 7 } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = weekTableView.dequeueReusableCellWithIdentifier("WeekDayCell", forIndexPath: indexPath) as! WeekDayCell cell.dayLbl?.text = weekArray[indexPath.row] cell.numAptsLbl?.text = "0" //indexPath.row.description //print("indexpath in tableview is \(indexPath)") return cell } 

假设

首先,你发布的json示例不是有效的json,而是你在debugging器中看到的输出。 我假设json将是类似于以下格式的东西:

 { "appointments": [ { "numApts": 1, "title": "Coffee", "scheduleDate": "2015-11-02" }, { "numApts": 2, "title": "Shower", "scheduleDate": "2015-11-04" }, { "numApts": 3, "title": "Rollercoaster!!!!", "scheduleDate": "2015-12-24" } ] } 

TL; DR

我build议您创build一个代表单个约会的Appointment模型。 然后,您应该创build一个包装周围的存储所有的约会,根据星期一天过滤。 你可以命名这个包装,无论你认为适合你的项目。

代码示例

我试图把你想实现的最简单的情况放在一起。 希望代码中使用的命名足以描述自己。

我认为这将有很多帮助来回答你的问题,并让你从这里开始。 我的代码的输出将类似于以下图像:

最终应用

现在,我需要强调的是,在开始在生产中使用这样的东西之前,需要注意的是,在这里和那里都有一些力量。

Appointment.swift

 // // Appointment.swift // WeekDays // // Created by Stefan Veis Pennerup on 02/11/15. // Copyright © 2015 Kumuluzz. All rights reserved. // import Foundation struct Appointment { // MARK: - Formatter private static var DateFormatter: NSDateFormatter = { let formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd" return formatter }() // MARK: - Properties let numApts: Int let title: String let scheduleDate: NSDate // MARK: - Initializers init(json: [String: AnyObject]) { numApts = json["numApts"] as? Int ?? 0 title = json["title"] as? String ?? "" let dateString = json["scheduleDate"] as? String ?? "" scheduleDate = Appointment.DateFormatter.dateFromString(dateString) ?? NSDate() } } 

WeekDaysModel.swift

 // // WeekDays.swift // WeekDays // // Created by Stefan Veis Pennerup on 02/11/15. // Copyright © 2015 Kumuluzz. All rights reserved. // import Foundation enum WeekDay: Int { // Sunday has been set as the initial index, because the NSDateComponents // has been created with Sunday as the initial day with an index of 1. // This is being taken into consideration in the getWeekDayIndexForDate() case Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } struct WeekDaysModel { // MARK: - Properties var appointments: [WeekDay: [Appointment]] = [ WeekDay.Monday:[], WeekDay.Tuesday:[], WeekDay.Wednesday:[], WeekDay.Thursday:[], WeekDay.Friday:[], WeekDay.Saturday:[], WeekDay.Sunday:[] ] // MARK: - Initializers init() {} init(json: [String: AnyObject]) { // Ensures there is data guard let appointmentsJson = json["appointments"] as? [[String: AnyObject]] else { return } // Parses the data points to the Appointment model let apts = appointmentsJson.map { json in return Appointment(json: json) } // Assigns each Appointment to a weekday _ = apts.map { apt in let i = getWeekDayIndexForDate(apt.scheduleDate) appointments[WeekDay(rawValue: i)!]! += [apt] } } // MARK: - Helpers private func getWeekDayIndexForDate(aDate: NSDate) -> Int { let cal = NSCalendar(identifier: NSCalendarIdentifierGregorian)! let comp = cal.components(.Weekday, fromDate: aDate) return (comp.weekday - 1) } } 

ViewController.swift

 // // ViewController.swift // WeekDays // // Created by Stefan Veis Pennerup on 02/11/15. // Copyright © 2015 Kumuluzz. All rights reserved. // import UIKit class ViewController: UITableViewController { // MARK: - Properties private var model = WeekDaysModel() { didSet { tableView.reloadData() } } // MARK: - Lifecycle methods override func viewDidLoad() { super.viewDidLoad() Backend.downloadAppointments{ self.model = $0 } } // MARK: - UITableViewDelegate // MARK: - UITableViewDataSource override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return model.appointments.count } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return model.appointments[WeekDay(rawValue: section)!]!.count } override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return String(WeekDay(rawValue: section)!) } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("myCell")! let apts = model.appointments[WeekDay(rawValue: indexPath.section)!]! cell.textLabel?.text = apts[indexPath.row].title return cell } } 

Backend.swift

 // // Backend.swift // WeekDays // // Created by Stefan Veis Pennerup on 02/11/15. // Copyright © 2015 Kumuluzz. All rights reserved. // import Foundation import Alamofire struct Backend { static func downloadAppointments(handler: (WeekDaysModel)->Void) { let url = "http://stefanveispennerup.com/so.json" Alamofire.request(.GET, url).responseJSON { response in // TODO: Check response code, etc.. if let json = response.result.value as? [String: AnyObject] { let model = WeekDaysModel(json: json) handler(model) } } } }