暑期项目开发实训 Day25

来源:互联网 发布:c语言汉诺塔游戏 编辑:程序博客网 时间:2024/05/19 02:23

周四: 上午代码整合;下午组内答辩;晚上继续优化

今天可以说是真的大功告成了。

由于事先删除了Storyboard和Launch Screen, 接口处理得也比较得当,因此整合工作很轻松。

中途遇到了一点小麻烦:

我在AppDelegate中声明了数据模型、静态常量控制器、模型拷贝

    var window: UIWindow?    let dataModel = DataModel()   // 公用数据模型        /** 静态常量 3个controller      **/    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)    }
        /**           数据模型 && 通知推送         **/                Constants.allweeks.dataModel = dataModel        Constants.thisweek.dataModel = dataModel        Constants.nextweek.dataModel = dataModel         let center = UNUserNotificationCenter.current()                center.delegate = self        return true


然后数据模型Data Model中有静态变量:

    /** 初始化数据     **/    struct Variables {                // 真实世界的本周list(空表)        static var thisweeklist = Checklist(            name: "Week \(Main.Variables.weekID_this)",            weekID: Main.Variables.weekID_this,            monthID: Main.Variables.monthID_this,            yearID: Main.Variables.yearID_this,            stTime: Main.Variables.stTime_this,            edTime: Main.Variables.edTime_this)                // 真实世界的下周list(空表)        static var nextweeklist = Checklist(            name: "Week \(Main.Variables.weekID_next)",            weekID: Main.Variables.weekID_next,            monthID: Main.Variables.monthID_next,            yearID: Main.Variables.yearID_next,            stTime: Main.Variables.stTime_next,            edTime: Main.Variables.edTime_next)            }

静态变量取自Main文件。根据初始化的进程,我需要在 judgeTime 之前判断参数。

否则,若不然,只能等到Main文件再判断参数,那时就晚了。

因此我和交互的同学在DataModel这一层进行传参,编写商业逻辑。

    /** 初始化      **/    init() {        print("初始化")        print("初始化时lists = \(lists.count)")                loadChecklists()        print("load时lists = \(lists.count)")                // 用户曾经使用过App,存在2张表,才进行变更判断        if lists.count==2 {            judgeTime()        }                        registerDefaults()        handleFirstTime()        print("初始化结束")        print("WeekUp_Documents folder is\(self.documentsDirectory())")        print("WeekUp_Data file path is\(self.dataFilePath())")            }

不过整个过程前后也就半小时吧。


下午答辩,老师指出我有几个缺陷有待改进:

1. 界面滑动方式不够美观,应该用push和pop水平滑动,不要垂直滑动。

2. 添加item后,应该按照DueDate排序,不要按照Item名排序

3. 添加item后,tableView的滚动条底端自动到达添加处

4. 添加item后,应该重新回到文字模式,给用户节省时间

我晚上一一将其解决了:

1.1 在Main文件里加入静态导航控制器

    // 静态导航控制器(修改)    struct Constants {        static let navigationViewController = UINavigationController(rootViewController: AppDelegate.Constants.thisweek)            }

1.2 在入口处,使用present。

    /** 正确入口     **/    @IBAction func enterThis() {                let c = Main.Constants.navigationViewController                self.present(c,animated:true, completion:nil)                //        print("name = \(DataModel.Variables.thisweeklist.name)")//        print("count = \(DataModel.Variables.thisweeklist.items.count)")//        print("week = \(DataModel.Variables.thisweeklist.weekID)")//        print("month = \(DataModel.Variables.thisweeklist.monthID)")//        print("year = \(DataModel.Variables.thisweeklist.yearID)")    }

1.3 ViewDidLoad中对导航栏进行UI设计,去掉Xib中的控件

      //设置导航栏标题字体、颜色白色        self.navigationController?.navigationBar.titleTextAttributes =        [NSForegroundColorAttributeName: UIColor.white, NSFontAttributeName:            UIFont(name:"Avenir-Heavy", size: 20)!]               let backImg = UIImage(named: "closeIcon")        let NextImg = UIImage(named: "Next Week")         let leftitem = UIBarButtonItem(image: backImg, style: UIBarButtonItemStyle.plain, target: self, action: #selector(cancel(_:)))        let rightitem = UIBarButtonItem(image: NextImg, style: UIBarButtonItemStyle.plain, target: self, action: #selector(nextWeek(_:)))                //设置itemButton颜色        leftitem.tintColor = UIColor.white        rightitem.tintColor = UIColor.white        self.navigationItem.leftBarButtonItem = leftitem        self.navigationItem.rightBarButtonItem = rightitem

1.4 成功push

    /** 下一周     **/    func nextWeek(_ sender: Any) {        let controller = AppDelegate.Constants.nextweek        //        controller.dataModel = AppDelegate.Constants.nextweek.dataModel        self.navigationController?.pushViewController(controller, animated: true)            }

第二个问题: 按item的Due Date排序

先来看排序方法:

    /**     sortItems  按照 DueDate 对 item 进行升序排列,上层为较早时间     **/    func sortItems() {        thisweeklist.items.sort(by: { item1, item2 in            return item1.dueDate.compare(item2.dueDate) == .orderedAscending })    }
然后在viewdidload中排序、重载数据
     // 排序 并 重载数据        sortItems()        tableView.reloadData()

第三个问题:底端自动滑到指定位置

     // tableView的底端 滚动到指定位置 (刚刚添加的item处)        var itemRowIndex = 0         for i in 0 ... thisweeklist.items.count-1 {            if item.itemID == thisweeklist.items[i].itemID {                itemRowIndex = i                print("find: \(itemRowIndex)")            }        }                let itemIndexPath = IndexPath(row: itemRowIndex, section: 0)        tableView.scrollToRow(at: itemIndexPath, at: UITableViewScrollPosition.bottom, animated: true)

第四个问题就是在done函数中加入一个AddModel就可以了。。。


然后我自己发现,使用了导航栏后, textField在输入文字时, 会自动下移:

解决方案:

  override func viewDidLoad() {        thisweeklist = dataModel.lists[0]   //从数据模型获取list        // 解决 textField 输入文字下移问题, 自动滚动调整 false        // 原因是: 导航栏+状态栏的存在,高度64,向下偏移64px        self.automaticallyAdjustsScrollViewInsets = false        .......}



最后的收尾:将状态栏变为白色:

首先打开项目的info.plist文件,插入<KEY, VALUE> =  <View controller-based status bar appearance, NO>
然后在AppDelegate的application(_:didFinishLaunchingWithOptions:) 中,写入:
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {                // 设置状态栏为白色        UIApplication.shared.statusBarStyle = .lightContent        ...    }

嗯,大功告成,等着录视频了。


原创粉丝点击