我有以下问题:

我有一个应用程序,它使用两个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?

10-07 21:53