我有以下问题:
我有一个应用程序,它使用两个tableViewControllers。第一个TableViewController列出
struct Task{
let type: String
[other attributes]
}
这些任务存储在TaskStore类中,其中包含一个静态共享实例,用于存储应用程序中的所有任务。
class TaskStore {
var tasks: [Task] = []
class var sharedInstance: TaskStore {
struct Static {
static let instance = TaskStore()
}
return Static.instance
}
}
现在,对于每个任务,我需要存储一组与该Task实例关联的子任务。因此,我创建了一个子任务结构
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] = []
}
现在的想法是,现在每个Task都有自己的SubtaskStore,它存储了手头任务的所有子任务。
第一个问题:是否有更好的方法将任务层次结构建模为子任务?我对编程很陌生,但设计看起来很直观。
我已经成功创建了一个交互式TableViewController,它在TaskStore中显示元素,并在添加/删除新任务时更新表。我现在已经在Task TableViewController和SubTask TableViewController之间创建了一个链接;单击TaskTableViewCell将打开一个新的SubTaskTableViewController(当前为空)。
第二个问题:假设用户选择的TaskTableViewCell在第5行。我想在" TaskStore [4] .subtasks"中显示元素。在SubtaskTableViewController中。我如何传递数字" 4"从TaskTableViewController中选定的TaskTableViewCell到SubTaskTableViewController并显示在TaskStore [4] .subtasks.sharedInstace中的元素?
答案 0 :(得分:0)
我认为你的架构并不是一个特别好的设置。
需要注意的重要一点是,如果要更改所有任务的某些属性,例如添加颜色属性,则需要在两个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方法使用故事板,则可以将信息传递给其他视图控制器。关于这个主题有很多关于SO的信息。
How do you share data between view controllers and other objects in Swift?