暑期项目开发实训 Day25

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

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

由于事先删除了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文件,插入 =  
然后在AppDelegate的application(_:didFinishLaunchingWithOptions:) 中,写入:
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        // 设置状态栏为白色
        UIApplication.shared.statusBarStyle = .lightContent

        ...
    }

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


你可能感兴趣的:(暑期项目实训,DataModel,IOS,textField文字偏移,排序,tableView滑动指定位置)