暑期项目开发实训 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:) 中,写入:
然后在AppDelegate的application(_:didFinishLaunchingWithOptions:) 中,写入:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // 设置状态栏为白色 UIApplication.shared.statusBarStyle = .lightContent ... }
嗯,大功告成,等着录视频了。
阅读全文
0 0
- 暑期项目开发实训 Day25
- 暑期项目开发实训 Day1
- 暑期项目开发实训 Day2
- 暑期项目开发实训 Day3
- 暑期项目开发实训 Day4
- 暑期项目开发实训 Day4
- 暑期项目开发实训 Day5
- 暑期项目开发实训 Day6
- 暑期项目开发实训 Day7
- 暑期项目开发实训 Day8
- 暑期项目开发实训 Day9
- 暑期项目开发实训 Day9
- 暑期项目开发实训 Day10
- 暑期项目开发实训 Day11
- 暑期项目开发实训 Day12
- 暑期项目开发实训 Day13
- 暑期项目开发实训 Day14
- 暑期项目开发实训 Day15
- Maven常用命令
- ES6基础教程(4)-字符串拓展
- caffe-windows的安装和配置(cpu)
- GraphicsStatsService常见的几个问题带来的思考
- AtOffer笔记-二叉树的镜像&顺时针打印矩阵&包含min函数的栈
- 暑期项目开发实训 Day25
- Python包安装:Arcpy 与 PCI 在 Anaconda 中的集成
- hdu 1072 Nightmare
- git 的安装和使用
- SpringMvc入门到开发(二)之基本原理
- Nginx系列—虚拟主机配置的三种方式(二)
- 文件权限篇(一)
- webstorm 控制台输出中文乱码
- 我的spring之旅一