合并两个TableViewControllers

时间:2016-09-19 14:36:25

标签: ios swift xcode swift3 xcode8

我有以下问题:

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

1 个答案:

答案 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?