【问题标题】:Data transfer between 2 data models using a single tableview with Swift使用 Swift 的单个表视图在 2 个数据模型之间传输数据
【发布时间】:2015-08-23 14:01:19
【问题描述】:

我有两个数据模型。一份用于待办事项,一份用于已完成项目。在这两种模型中,它只需要项目的内容和完成时的标志。以下是代码:
对于待办事项:

class TodoList: NSObject {
    var task: String
    var completed: Bool

    init(task: String) {
        self.task = task
        self.completed = false
    }
}

对于已完成的项目:

class CompletedList: NSObject {
    var task: String
    var completed: Bool

    init(task: String) {
        self.task = task
        self.completed = true
    }
}

我想要实现的是,当待办事项列表中的项目标记为已完成时,它将从待办事项模型中删除并移动/复制到已完成的项目模型。我怎样才能让它工作?谢谢。

PS:这两个数据模型将共享一个带有分段控制的表格视图。

编辑: 也许我之前的陈述令人困惑。让我改写一下:
我设置了一个带有分段控制的 UITableView。
分段控件有两个部分,“待办事项”和“完成”。
选择“待办事项”时,表格视图将显示未完成的项目列表。选择“完成”后,表格视图将显示已完成的项目列表。
实现这一目标的最佳做法是什么?

【问题讨论】:

  • 你倒退了。两个数据模型不会共享同一个表视图。数据模型必须对任何视图一无所知。视图需要了解数据模型。所以表格视图将使用两种数据模型(通过表格视图的dataSource
  • 谢谢。我知道模型一定不知道视图。如何在 View 控制器中设置它以将已完成的项目从待办事项列表传递到已完成列表?
  • 我将各种信息存储在自定义 UITableViewCells 中,因为我知道它会在单元格的整个生命周期内跟随单元格。
  • @Larcerax 我使用 BOOL 值设置模型。但我不知道如何显示它。你能告诉我如何只用一个数据模型来实现这一点吗?谢谢。
  • 这假设您知道如何使用 UITableViews 来回折腾数组,但这是一项糟糕的任务,因此我避免了所有这些,并使用 Voided 块方法作为自定义单元格的属性然后以这种方式捕获触摸事件,然后它就成为您完全通过自定义单元对象控制的东西。

标签: ios swift uitableview uisegmentedcontrol


【解决方案1】:

几个反应:

  1. 您的类名表明这些代表任务列表,但实现(即任务描述和完成状态)表明这些类代表单个任务。我建议您澄清您的模型,可能为这两种类型的实体(单个任务与任务集合)设置单独的类。

  2. 我建议一个 Task 类。唯一的问题是您如何捕获 todocomplete 状态:

    • 您可以仅将完成状态表示为Task 的属性:

      class Task {
          var title: String
          var completed: Bool
      
          init(title: String, completed: Bool = false) {
              self.title = title
              self.completed = completed
          }
      }
      

      然后,您可以拥有所有任务的集合:

      var tasks = [Task]()
      

      然后,当您需要已完成任务的列表时,您可以:

      let completed = tasks.filter() { $0.completed }
      

      或者,同样的,待办事项列表:

      let todo = tasks.filter { !$0.completed }
      

      如果您有很长的列表,这种实现是不切实际的,但对于简单的问题列表,这是一种简单的方法。

    • 或者,您可以简化任务类,删除completed 状态:

      class Task {
          var title: String
      
          init(title: String) {
              self.title = title
          }
      }
      

      然后维护任务集合(数组或集合或任何对您的应用有意义的东西):

      var todo = [Task]()
      var completed = [Task]()
      

      然后,当您想将待办事项列表中的一项移动到已完成列表中时,您只需将其从其中一项中移除,然后将其添加到另一项中即可。

      func completeTodoTaskAtIndex(index: Int) {
          if index < todo.count {
              let task = todo[index]
              todo.removeAtIndex(index)
              completed.append(task)
          }
      }
      

一旦你为你的应用找到了合适的模型,那么让 tableview 正确地显示结果就很容易了。所以先确定模型,其余的就顺理成章了。

【讨论】:

  • 非常感谢,我使用了替代方法。
【解决方案2】:

数据模型无关紧要。因为这些与您的观点无关。您必须设置将呈现给 tableview 的数据。

这两个数据模型将共享一个表视图 分段控制。

您可以从 tableView 委托进行设置。喜欢:

override func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
    return 2
}

override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
    if section == 0
        return toDoTask.count
    else
        return completedTask.count

}

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {

    //Check the section and return data if it is completed or incomplete
    return cell
}

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 2015-11-16
    相关资源
    最近更新 更多