暑期项目开发实训 Day23

来源:互联网 发布:网络骗贷十六万借呗 编辑:程序博客网 时间:2024/06/11 09:53

记周二全日至今早:

加了一个DataModel, 加了一个AllWeekLists作为中间层(方便测试商业逻辑)

我写的DataModel如下:

////  DataModel.swift//  AddPartChecklist////  Created by 黄豪杰 on 2017/7/18.//  Copyright © 2017年 黄豪杰. All rights reserved.//import Foundationclass DataModel {    var lists = [Checklist]()        // 测试数据    struct Variables {        static var thisweeklist = Checklist(            name: "Week \(Main.Variables.weekID)",            weekID: Main.Variables.weekID,            monthID: Main.Variables.monthID,            yearID: Main.Variables.yearID)        static var nextweeklist = Checklist(            name: "Week \(Main.Variables.weekID+1)",            weekID: Main.Variables.weekID+1,            monthID: Main.Variables.monthID,            yearID: Main.Variables.yearID)    }            init() {        print("初始化")        print("初始化时lists = \(lists.count)")                loadChecklists()        print("load时lists = \(lists.count)")                registerDefaults()        handleFirstTime()        print("初始化结束")        print("WeekUp_Documents folder is\(self.documentsDirectory())")        print("WeekUp_Data file path is\(self.dataFilePath())")    }        func documentsDirectory() -> URL {        let paths = FileManager.default.urls(for: .documentDirectory,                                             in: .userDomainMask)        return paths[0]    }        func dataFilePath() -> URL {        return documentsDirectory().appendingPathComponent("Checklists.plist")    }        // save    func saveChecklists() {        let data = NSMutableData()        let archiver = NSKeyedArchiver(forWritingWith: data)        archiver.encode(lists, forKey: "Checklists")        archiver.finishEncoding()        data.write(to: dataFilePath(), atomically: true)    }        // load    func loadChecklists() {        let path = dataFilePath()        if let data = try? Data(contentsOf: path) {            let unarchiver = NSKeyedUnarchiver(forReadingWith: data)            print("decodeObject")            lists = unarchiver.decodeObject(forKey: "Checklists") as! [Checklist]            unarchiver.finishDecoding()            print("finishDecoding")        }            }        func registerDefaults() {        let dictionary: [String: Any] = ["ChecklistIndex": -1,                                         "FirstTime": true,                                         "ChecklistItemID": 0 ]        UserDefaults.standard.register(defaults: dictionary)    }        func handleFirstTime() {        let userDefaults = UserDefaults.standard        let firstTime = userDefaults.bool(forKey: "FirstTime")        print("here?")        print("firstTime = \(firstTime)")        print("lists = \(lists.count)")        if firstTime || lists.count == 0 {            print("firstTime ...")            let checklist1 = DataModel.Variables.thisweeklist            let checklist2 = DataModel.Variables.nextweeklist            lists.append(checklist1)            lists.append(checklist2)                        indexOfSelectedChecklist = 0            userDefaults.set(false, forKey: "FirstTime")            userDefaults.synchronize()        }            }        var indexOfSelectedChecklist: Int {        get {            return UserDefaults.standard.integer(forKey: "ChecklistIndex")        }        set {            UserDefaults.standard.set(newValue, forKey: "ChecklistIndex")            UserDefaults.standard.synchronize()        }    }            class func nextChecklistItemID() -> Int {        let userDefaults = UserDefaults.standard        let itemID = userDefaults.integer(forKey: "ChecklistItemID")        userDefaults.set(itemID+1, forKey: "ChecklistItemID")        userDefaults.synchronize()        return itemID    }            }

测试加载数据时,频繁出现datamodel为nil的情况。

查看AppDelegate发现:我在其中声明了常量 dataModel,然后

 let controller = AllWeekLists(nibName: "WeekLists", bundle: nil)

而在Main.swift中,因为涉及到跳转操作,controller被重复使用,导致dataModel被多次声明。

  @IBAction func enterAll() {        // dataModel 被多次声明        let controller = AllWeekLists(nibName:"AllWeekLists", bundle:nil)        controller.modalTransitionStyle = .coverVertical        self.present(controller,animated:true, completion:nil)    }


所以跳转后的controller的dataModel是空的。

解决方案:把所有涉及的controller声明为静态常量

    let dataModel = DataModel()        struct Constants {        static let allweeks = AllWeekLists(nibName: "AllWeekLists", bundle: nil)        static let thisweek = ThisWeekController(nibName:"ThisWeekController", bundle:nil)        static let nextweek = NextWeekController(nibName:"NextWeekController", bundle:nil)    }


在 func application(_ application:UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey:Any]?) ->Bool {} 中赋值:
        Constants.allweeks.dataModel = dataModel        Constants.thisweek.dataModel = dataModel        Constants.nextweek.dataModel = dataModel
保证它们共用同一个dataModel。


另外出现的问题:sava无误,plists中具备所有编码信息。但是load时可以加载lists,但是items不能解码。

而我使用的两个controller是 ThisWeek 和 NextWeek。

它们存在重复初始化,导致获取的并不是解码后的list,而是初始化的静态变量

 var thisweeklist = DataModel.Variables.thisweeklist

 var nextweeklist = DataModel.Variables.nextweeklist

Data Model中的静态变量:

    // 测试数据    struct Variables {        static var thisweeklist = Checklist(            name: "Week \(Main.Variables.weekID)",            weekID: Main.Variables.weekID,            monthID: Main.Variables.monthID,            yearID: Main.Variables.yearID)        static var nextweeklist = Checklist(            name: "Week \(Main.Variables.weekID+1)",            weekID: Main.Variables.weekID+1,            monthID: Main.Variables.monthID,            yearID: Main.Variables.yearID)    }


所以解决方案是 ( 记得我们共享同一个dataModel了么?)

var nextweeklist: Checklist!

 override func viewDidLoad() {            nextweeklist = dataModel.lists[1]      ......}

这样就解决了解码时的问题。

两种问题的解决方向是类似的。

看看Data Model的初始化可以更细致的了解: load时lists的数量说明解码是没问题的,关键在于没有用同一个lists

    init() {        print("初始化")        print("初始化时lists = \(lists.count)")                loadChecklists()        print("load时lists = \(lists.count)")                registerDefaults()        handleFirstTime()        print("初始化结束")        print("WeekUp_Documents folder is\(self.documentsDirectory())")        print("WeekUp_Data file path is\(self.dataFilePath())")    }


    func handleFirstTime() {        let userDefaults = UserDefaults.standard        let firstTime = userDefaults.bool(forKey: "FirstTime")        print("here?")        print("firstTime = \(firstTime)")        print("lists = \(lists.count)")        if firstTime || lists.count == 0 {            print("firstTime ...")            let checklist1 = DataModel.Variables.thisweeklist            let checklist2 = DataModel.Variables.nextweeklist            lists.append(checklist1)            lists.append(checklist2)                        indexOfSelectedChecklist = 0            userDefaults.set(false, forKey: "FirstTime")            userDefaults.synchronize()        }            }

今天是收工阶段,还要解决的问题:

1. NextWeek的DueDate显示问题 (上午)

2. items的toggle问题 (争取上午)

3. 商务逻辑(下午)

4. 界面美化与代码整合 (晚上)







原创粉丝点击