你会如何在swift ios中设计一个“周视图”?

时间:2017-10-10 16:22:28

标签: ios swift uicollectionview software-design

在上面的照片中,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]()

对于“周视图”,我如何为每天分配一个唯一的任务列表?当私人教练创建当天的任务时,集合视图索引如何保存一系列独特的任务?我不确定这是否是最佳的做法

我不一定在寻找任何人写出代码(尽管如果你这样做会很好),而只是对如何完成代码的概述。欢迎任何建议。

1 个答案:

答案 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!)
    }
}