我有以下问题:
我有一个应用程序,它使用两个tableViewControllers。第一个TableViewController列表
struct Task{
let type: String
[other attributes]
}
这些任务存储在TaskStore类中,并带有一个静态共享实例,该实例将所有Tasks存储在应用程序中。
class TaskStore {
var tasks: [Task] = []
class var sharedInstance: TaskStore {
struct Static {
static let instance = TaskStore()
}
return Static.instance
}
}
现在,对于每个任务,我需要存储一组与该任务实例相关联的子任务。因此,我创建了一个子任务结构
struct Subtask{
let subtype: String
[other attributes]
}
并创建了SubtaskStore类,我对其进行了修改,使其不再包括静态实例,而是:
class SubtaskStore {
var subtasks: [Subtask] = []
class var sharedInstance: SubtaskStore {
let instance = SubtaskStore()
return instance
}
}
注意:在我看来,这比简单地将一系列Subtasks作为Task结构的成员包括要有益得多,因为我可以创建操作SubtaskStore.sharedinstance的方法。
然后我将Task结构修改如下
struct Task{
let type: String
var subtasks: SubtaskStore // as oppose to: var subtasks [Subtask] = []
}
这个想法是,现在每个任务都有自己的SubtaskStore,它存储手边的所有子任务。
第一个问题:是否有更好的方法来建模任务到子任务的层次结构?我对编程很陌生,但是设计似乎很直观。
我已经成功创建了一个交互式TableViewController,它可以显示TaskStore中的元素并在添加/删除新Task时更新Table。我现在在Task TableViewController和SubTask TableViewController之间创建了一个链接。单击TaskTableViewCell会打开一个新的SubTaskTableViewController(当前为空)。
第二个问题:假设用户选择的TaskTableViewCell在第5行中。我想在SubtaskTableViewController的“ TaskStore [4] .subtasks”中显示元素。如何将数字“ 4”从TaskTableViewController中选定的TaskTableViewCell传递到SubTaskTableViewController并显示在TaskStore [4] .subtasks.sharedInstace中的元素上?
最佳答案
我认为您的架构不是特别好的设置。
需要注意的主要事情是,如果要更改所有任务的某些属性(例如添加颜色属性),则需要在两个Structs中实现它,然后更新两个单独的视图控制器进行着色。如果您想允许子任务具有子任务,会发生什么?我们是否必须不断创建SubSubTask
类型的更深结构?甚至在我们进行任何更改之前-我相信您都不会兴奋地实现两个单独的但几乎相同的表视图控制器。
更好的方法是使用单个结构Task
,该结构允许子任务数组。您的TaskStore
仅跟踪顶级任务,子任务由其父任务“拥有”。
struct Task {
var children = [Task]()
// other properties
}
class TaskStore {
var tasks = [Task]()
// Swift now supports static vars on classes
static var sharedInstance = TaskStore()
}
使用此设置,您还可以只编写一个表视图控制器,该控制器显示提供给它的任务列表(从您选择的某些来源)。该任务列表可以是子列表,但与表视图控制器无关-很好-因为它使您的代码更简单并且更易于维护。
至于第二部分,如果您正在使用情节提要,请使用发送视图控制器的prepare for segue方法将信息传递给其他视图控制器。因此,这里有很多关于此主题的信息。
How do you share data between view controllers and other objects in Swift?