2016-09-19 54 views
0

我有以下问题:组合两个TableViewControllers

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

现在,对于每个任务,我需要存储一组与任务实例关联的子任务。因此,我创建了一个子任务结构

struct Subtask{ 
    let subtype: String 
    [other attributes] 
} 

,并创建了一个SubtaskStore类,我修改,使其不再包括静态实例,而是:

class SubtaskStore { 
    var subtasks: [Subtask] = [] 

    class var sharedInstance: SubtaskStore { 
     let instance = SubtaskStore() 
     return instance 
    } 
} 

注:这对我来说是很大不是简单地包括子任务的阵列作为工作结构的成员,因为我可以创建该SubtaskStore.sharedinstance的操作的方法更有利。

然后我修改了任务结构如下

struct Task{ 
    let type: String 
    var subtasks: SubtaskStore // as oppose to: var subtasks [Subtask] = [] 
} 

的想法是,现在每个任务都有自己的SubtaskStore,存储任务的所有子任务在手。

第一个问题:有没有更好的方法来建模任务到子任务的层次结构?我对编程颇为陌生,但设计看起来很直观。

我已经成功地创建,显示在TaskStore的元素和更新当一个新任务添加/去除表的交互式TableViewController。我现在已经在Task TableViewController和SubTask TableViewController之间创建了一个链接;点击一个TaskTableViewCell打开一个新的SubTaskTableViewController(当前为空)。

第二个问题:假设由用户选择的TaskTableViewCell是在第5行我想显示在“TaskStore [4] .subtasks”在SubtaskTableViewController的元素。如何传递来自所选择的TaskTableViewCell数字“4”,在TaskTableViewController到SubTaskTableViewController和显示器上在TaskStore [4] .subtasks.sharedInstace元素?

回答

0

我认为,你的架构是不是一个特别好的设置。

最重要的事情需要注意的是,如果你想改变的所有任务的一些特性,如添加颜色属性,你需要实现它在两个结构,然后更新两个不同的视图控制器上色。做我们必须不断创造SubSubTask类型的更深层次的结构 - 如果你想要让子任务有子任务,会发生什么?即使在我们做出任何改变之前 - 我相信你不会兴奋地实现两个单独的,但几乎相同的表视图控制器。

更好的方法是有一个结构,Task它允许一个子任务数组。您的TaskStore只会跟踪顶级任务,子任务由其父任务“拥有”。使用此设置,您也可以只编写一个表格视图控制器,该控制器显示提供给它的任务列表(来自您选择的某个源)。该任务列表可以是一个子列表,但它与表视图控制器无关 - 这很好 - 因为它使您的代码更简单并且更容易维护。


至于第二部分,你如果使用的是故事板使用用于发送视图控制器赛格瑞方法的制备可以将信息传递给其他视图控制器。关于SO的主题有很多信息。

How do you share data between view controllers and other objects in Swift?

+0

我会给你买一瓶啤酒,那种陌生人。谢谢! – user227837