在swiftios中,你会如何设计“周视图”?
How would you design a “week view” in swift ios?
在上面的照片中,UI 详细介绍了一个具有 7 天集合视图("week view")的设计,当一天过去时,每个单元格自动递增到第二天,这是因为 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]()
对于 "week view" 我将如何为每一天分配一个唯一的任务列表?当私人教练创建当天的任务时,集合视图索引如何保存唯一的任务数组?我不确定这是否是执行此操作的最佳方式
我不一定要找任何人写代码(尽管如果你这样做就太好了),而只是对应该如何完成的概述解释。欢迎任何建议。
如果视图顶部始终有 7 个单元格,并且只有 7 个单元格,老实说我不会使用 UICollectionView
。当您需要滚动浏览大量 data/images 时,UICollectionView
真的很出色。相反,我会将那些 'cells' 普通 UIView
s(7) 放置在水平 StackView 中。
然后您可以为这些 UIView 提供点击手势的目标操作,这会更新和更改您的 DatSource 用于在底部填充 UITableView 所需的任务。
就更新日期而言,调用 Date()
将提供设备的当前日期时间戳。您可以使用该 Date
对象的“.addingTimeInterval()”为接下来的几天添加 24,48 等...小时。
编辑:
举个例子,你提到你将把你的任务放在一个数组中,你可以创建一个字典来保存每天的任务数组,或者数组数组:var taskDictionary : [String : [Task]]?
或var taskArray : [[Task]]?
将 tapGesture 的选择器设置为将控制从 Dictionary/Array:
中拉取内容的功能
func dayOfWeekTapped(_ sender: UIView) {
myTableViewDataSource = taskDictionary[sender.tag]
//myTableViewDataSource = taskArray[sender.tag]
myTableView.reloadData()
}
我这里用的是tag
属性的例子,但是最好创建一个UIView的子类,这样你就可以访问view里面的UIElements:
func dayOfWeekTapped(_ sender: CustomUIView) {
myTableViewDataSource = taskDictionary[sender.dateLbl.text]
//myTableViewDataSource = taskArray[(sender.dateLabel.text as! NSString).intValue]
myTableView.reloadData()
}
我在想这个问题并且很好奇,但是 Custom UIView 可能看起来像这样(很快就拼凑起来所以可以稍微清理一下):
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!)
}
}
VC:
class ViewController: UIViewController, DayViewTappedDelegate {
@IBOutlet var dayBtns : [DayView]!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
for i in 0 ..< dayBtns.count {
let date = Date().addingTimeInterval(TimeInterval(86400 * i))
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd"
dayBtns[i].dateLbl.text = dateFormatter.string(from: date)
dayBtns[i].dateLbl.textAlignment = .center
dayBtns[i].setDelegateAndTap(self)
}
}
func daySelected(_ selectedLabelText: String) {
print(selectedLabelText)
}
}
在上面的照片中,UI 详细介绍了一个具有 7 天集合视图("week view")的设计,当一天过去时,每个单元格自动递增到第二天,这是因为 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]()
对于 "week view" 我将如何为每一天分配一个唯一的任务列表?当私人教练创建当天的任务时,集合视图索引如何保存唯一的任务数组?我不确定这是否是执行此操作的最佳方式
我不一定要找任何人写代码(尽管如果你这样做就太好了),而只是对应该如何完成的概述解释。欢迎任何建议。
如果视图顶部始终有 7 个单元格,并且只有 7 个单元格,老实说我不会使用 UICollectionView
。当您需要滚动浏览大量 data/images 时,UICollectionView
真的很出色。相反,我会将那些 'cells' 普通 UIView
s(7) 放置在水平 StackView 中。
然后您可以为这些 UIView 提供点击手势的目标操作,这会更新和更改您的 DatSource 用于在底部填充 UITableView 所需的任务。
就更新日期而言,调用 Date()
将提供设备的当前日期时间戳。您可以使用该 Date
对象的“.addingTimeInterval()”为接下来的几天添加 24,48 等...小时。
编辑:
举个例子,你提到你将把你的任务放在一个数组中,你可以创建一个字典来保存每天的任务数组,或者数组数组:var taskDictionary : [String : [Task]]?
或var taskArray : [[Task]]?
将 tapGesture 的选择器设置为将控制从 Dictionary/Array:
中拉取内容的功能func dayOfWeekTapped(_ sender: UIView) {
myTableViewDataSource = taskDictionary[sender.tag]
//myTableViewDataSource = taskArray[sender.tag]
myTableView.reloadData()
}
我这里用的是tag
属性的例子,但是最好创建一个UIView的子类,这样你就可以访问view里面的UIElements:
func dayOfWeekTapped(_ sender: CustomUIView) {
myTableViewDataSource = taskDictionary[sender.dateLbl.text]
//myTableViewDataSource = taskArray[(sender.dateLabel.text as! NSString).intValue]
myTableView.reloadData()
}
我在想这个问题并且很好奇,但是 Custom UIView 可能看起来像这样(很快就拼凑起来所以可以稍微清理一下):
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!)
}
}
VC:
class ViewController: UIViewController, DayViewTappedDelegate {
@IBOutlet var dayBtns : [DayView]!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
for i in 0 ..< dayBtns.count {
let date = Date().addingTimeInterval(TimeInterval(86400 * i))
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd"
dayBtns[i].dateLbl.text = dateFormatter.string(from: date)
dayBtns[i].dateLbl.textAlignment = .center
dayBtns[i].setDelegateAndTap(self)
}
}
func daySelected(_ selectedLabelText: String) {
print(selectedLabelText)
}
}