在上面的照片中,UI详细说明了一个带有7天集合视图(“周视图”)的设计,该视图会自动将每个单元格递增到当天过去的第二天,这是因为7个单元格是静态的。每天都有一个与之相关的任务列表,如上所示,每天用户必须尝试并由他们的私人教练完成所有分配的任务。
我在下面列出了几个关于如何构建这样的应用程序的设计问题:
当新的一天过去时,我如何设计7个收集单元格以自动更新? 我怎样才能让每一天都拥有自己独特的任务列表? 我将在下面提供一些数据模型代码,并将我的想法与代码一起提供。
这是我的任务的结构,我选择了一个结构,因为每天的任务可能不同,但如果它们恰好相似或相同,那么复制结构并从那里修改它会更加优化。任务将由另一个屏幕上的私人教练创建,但我认为这个模型已经足够好了。你们觉得怎么样?
struct Task {
var taskIcon: UIImage!
var taskName: String!
var taskDesc: String!
}
// Put the Task model in array to use in each day?
var tasks = [Task]()
对于“周视图”,我如何为每天分配一个唯一的任务列表?当私人教练创建当天的任务时,集合视图索引如何保存一系列独特的任务?我不确定这是否是最佳的做法
我不一定在寻找任何人写出代码(尽管如果你这样做会很好),而只是对如何完成代码的概述。欢迎任何建议。
答案 0 :(得分:1)
如果你总是在视图的顶部有7个单元格,而且只有7个单元格,我老实说不会使用UICollectionView
。当你需要能够滚动的大量数据/图像时UICollectionView
真的很闪耀。相反,我会将那些'单元'正常UIView
s(7)放在水平StackView中。
然后你可以为那些UIView提供一个针对轻敲手势的目标动作,该手势会更新和更改用于填充底部UITableView的DatSource以及所需的任务。
至于使用日期更新,拨打Date()
将给出设备的当前日期时间戳。您可以使用Date
对象的`.addingTimeInterval()'为接下来的几天添加24,48等小时。
编辑:
当然,举个例子,你提到你将把你的任务放在一个数组中,你可以创建一个Dictionary来保存每天的任务数组,或者一组数组:var taskDictionary : [String : [Task]]?
或{{ 1}}
将tapGesture的选择器设置为一个控制从Dictionary / Array中提取内容的函数:
var taskArray : [[Task]]?
我在这里使用func dayOfWeekTapped(_ sender: UIView) {
myTableViewDataSource = taskDictionary[sender.tag]
//myTableViewDataSource = taskArray[sender.tag]
myTableView.reloadData()
}
属性作为示例,但最好创建一个UIView子类,以便您可以访问视图中的UIElements:
tag
我正在考虑这个问题而且很好奇,但是Custom UIView可能看起来像这样(非常快速地抛在一起所以它可以被清理一下):
func dayOfWeekTapped(_ sender: CustomUIView) {
myTableViewDataSource = taskDictionary[sender.dateLbl.text]
//myTableViewDataSource = taskArray[(sender.dateLabel.text as! NSString).intValue]
myTableView.reloadData()
}
VC:
protocol DayViewTappedDelegate {
func daySelected(_ selectedLabelText: String)
}
class DayView: UIView {
@IBOutlet var dateLbl: UILabel!
var tapGesture: UITapGestureRecognizer?
var delegate: DayViewTappedDelegate?
func setDelegateAndTap(_ delegate: DayViewTappedDelegate) {
self.delegate = delegate
self.tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dayViewTapped))
tapGesture?.numberOfTapsRequired = 1
self.addGestureRecognizer(tapGesture!)
}
@objc
func dayViewTapped() {
delegate!.daySelected(self.dateLbl.text!)
}
}