基于 Web 服务实现快速更新行的标签

Posted

技术标签:

【中文标题】基于 Web 服务实现快速更新行的标签【英文标题】:Updating row's label based of web service implementation swift 【发布时间】:2015-11-02 14:48:48 【问题描述】:

我有一个包含 7 行的表格视图,周一、周二、....、周日。我的应用从 Web 服务接收到一个 json,其格式为:

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

所以我试图遍历 json 响应并更新我们工作日的标签,如果它与收到的 json 中的日期匹配。

不确定如何实现。我需要一个模型课吗?比如:

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
    

我今天尝试的是一个像这样更新行文本的函数,但我没有进入最终的 if let 条件来访问单元格以更新标签:

    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

【问题讨论】:

【参考方案1】:

假设

首先,您发布的 json 示例不是有效的 json,而是您将在调试器中看到的输出。我假设 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

我建议您创建一个代表单个约会的Appointment 模型。然后,您应该创建一个包装器,围绕该包装器存储所有约会,并根据工作日进行过滤。您可以将此包装器命名为您认为适合您项目的任何名称。

代码示例

我已经尝试为您想要实现的内容汇总最简单的案例。希望代码中使用的命名足以说明问题。

我认为这将有助于回答您的问题并让您从这里开始。我的代码输出将类似于下图:

现在,我需要强调一点,在您开始在生产中使用类似的东西之前,您需要注意这里和那里的一些强制展开。

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)
            
        
      

【讨论】:

以上是关于基于 Web 服务实现快速更新行的标签的主要内容,如果未能解决你的问题,请参考以下文章

AWS考证方向:实现WEB负载均衡

NSTableview 中选定行的标签颜色

具有 3000 个标签和 1000000 行的分类器,内存错误

《ClickHouse企业级应用:入门进阶与实战》8 基于ClickHouse Bitmap实现DMP用户画像标签圈人

《ClickHouse企业级应用:入门进阶与实战》8 基于ClickHouse Bitmap实现DMP用户画像标签圈人

Android自定义View(LineBreakLayout-自动换行的标签容器)