周四: 上午代码整合;下午组内答辩;晚上继续优化
今天可以说是真的大功告成了。
由于事先删除了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
/** 初始化数据
**/
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文件再判断参数,那时就晚了。
因此我和交互的同学在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)
}
/** 正确入口
**/
@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)")
}
//设置导航栏标题字体、颜色白色
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
/** 下一周
**/
func nextWeek(_ sender: Any) {
let controller = AppDelegate.Constants.nextweek
// controller.dataModel = AppDelegate.Constants.nextweek.dataModel
self.navigationController?.pushViewController(controller, animated: true)
}
先来看排序方法:
/**
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)
然后我自己发现,使用了导航栏后, textField在输入文字时, 会自动下移:
解决方案:
override func viewDidLoad() {
thisweeklist = dataModel.lists[0] //从数据模型获取list
// 解决 textField 输入文字下移问题, 自动滚动调整 false
// 原因是: 导航栏+状态栏的存在,高度64,向下偏移64px
self.automaticallyAdjustsScrollViewInsets = false
.......
}
最后的收尾:将状态栏变为白色:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// 设置状态栏为白色
UIApplication.shared.statusBarStyle = .lightContent
...
}