2016-09-19 78 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