2017-07-19 77 views
1

我正在製作一個任務共享應用程序,您可以與多個人共享多個任務列表(例如與您的配偶一個,您的孩子一個等)。每個列表的數據源都是一個名爲TaskList的結構,所以我將有多個TaskList實例。我應該在哪裏初始化這些實例?在哪裏初始化UITableViewController中的多個實例的結構

我是新來的,任何幫助將不勝感激!

這是創建使用結構任務列表任務列表中UITableViewController代碼:

import UIKit 

class LoLFirstTableViewController: UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 60.0 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return tasks.count 
    } 

    @IBAction func cancelToLoLFirstTableViewController(_ segue:UIStoryboardSegue) { 
    } 

    @IBAction func saveAddTask(_ segue:UIStoryboardSegue) { 
     if let AddTaskTableViewController = segue.source as? AddTaskTableViewController { 

      if let task = AddTaskTableViewController.task { 
       tasks.append(task) 

       let indexPath = IndexPath(row: tasks.count-1, section: 0) 
       tableView.insertRows(at: [indexPath], with: .automatic) 
      } 
     } 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath) as! TaskCell 
     let task = tasks[indexPath.row] 
      cell.task = task 

     if cell.accessoryView == nil { 
      let cb = CheckButton() 
      cb.addTarget(self, action: #selector(buttonTapped(_:forEvent:)), for: .touchUpInside) 
      cell.accessoryView = cb 
     } 
     let cb = cell.accessoryView as! CheckButton 
     cb.check(tasks[indexPath.row].completed) 

     return cell 
    } 

    func buttonTapped(_ target:UIButton, forEvent event: UIEvent) { 
     guard let touch = event.allTouches?.first else { return } 
     let point = touch.location(in: self.tableView) 
     let indexPath = self.tableView.indexPathForRow(at: point) 

     var tappedItem = tasks[indexPath!.row] as Task 
     tappedItem.completed = !tappedItem.completed 
     tasks[indexPath!.row] = tappedItem 

     tableView.reloadRows(at: [indexPath!], with: UITableViewRowAnimation.none) 
    } 
} 

這是任務列表代碼:

import UIKit 

struct TaskList { 
    var buddy: String 
    var phoneNumber: String 
    var tasks: [Task] 
} 

回答

1

第一個選項。您可以在對象創建某種經理和存儲列表:

class TaskListsManager 
{ 
    var taskLists:[TaskList] = [] 
} 

然後通過你的viewcontrollers之間的對象的實例:

let taskListsManager = TaskListsManager() 

firstViewController.taskListsManager = taskListsManager 
secondViewController.taskListsManager = taskListsManager 

第二個選項是創建一個單對象:

class TaskListsManager 
{ 
    static let sharedInstance = TaskListsManager() 

    var taskLists:[TaskList] = [] 
} 

而且你可以用它在你的應用程序的任何地方:

let first = TaskListsManager.sharedInstance.taskLists.first 
+0

我對TaskListsManager方法稍微感到滿意,所以這就是我現在正在實施的方法。以下幾行的目的是什麼?在更改taskListsManager後更新數據? firstViewController.taskListsManager = tasksListsManager secondViewController.taskListsManager = taskListsManager –

+1

@BobF。有點。如果你想只有一個經理實例,你必須在viewcontrollers之間傳遞它。因此,當您的應用程序啓動時,您創建TaskListsManager的一個實例,然後將其傳遞給您的第一個viewconteroller,然後如果您需要導航到另一個viewcontroller,您將管理器實例從第一個控制器傳遞到第二個。數據更新是一個不同的問題,爲此,您可以使用通知(https://developer.apple.com/documentation/foundation/notificationcenter)或協議/代理。 –

+0

@Nikita_Gaydukov啊,好的。那麼這些行應該在TaskListsManager對象中?或者在UITableViewController中?因爲如果我將它們放在UITableViewController中,則出現「任務」的任何地方都會收到「未解析的標識符任務」錯誤。 let taskListsManager = TaskListsManager() firstViewController.taskListsManager = taskListsManager secondViewController.taskListsManager = taskListsManager –