【问题标题】:UITableView numberOfRowsInSection - showing complete/incomplete tasksUITableView numberOfRowsInSection - 显示完成/未完成的任务
【发布时间】:2016-06-24 04:10:13
【问题描述】:

我对 Swift 和 iOS 的世界还很陌生,我正在创建一个待办事项列表应用程序。我有显示列表名称及其任务的详细视图。我的目标是在两个单独的部分中显示任务,一个用于未完成的任务,另一个用于已完成的任务。

在 numberOfRowsInSection 中,如果我使用:

return list.tasks.count

我明白了:

在我的 numberOfSectionsInTableView 方法中,我返回 2,正如您在图像中看到的,我将任务返回到两个部分。原因对我来说很明显,但我不知道如何做到这一点。

在 list.task.count 中,“task”是一个类,它有一个属性“var isComplete: Bool = false”,我希望在这里用它来分隔完成/未完成的任务。提前谢谢你。

【问题讨论】:

  • 你能显示“列表”模型吗?你是怎么设计的。
  • 这是我改成的。如您所见,我现在使用单独的数组来处理完整和不完整的任务。 class List: NSObject { var name = "" // var tasks = [Task]() var completeTask = [Task]() var incompleteTask = [Task]() }

标签: arrays swift uitableview


【解决方案1】:

拥有不同的数组可能会更好。一个用于完成任务,一个用于未完成任务,然后您可以查看 Table View 的部分以了解要返回多少行。

in numberOfRows:

if section == 0 {
    return completedTasks.count
} else {
    return incompleteTasks.count
}

这还可以让您检查 cellForRowAtIndexPath 部分,您无需费心记住您完成/未完成的任务在数组中的哪个位置:

if indexPath.section == 0 {
    cell.task = completedTasks[indexPath.row]
} else {
    cell.task = incompleteTask[indexPath.row]
}

更新:

在 cmets 中解决这个问题:

if let destination = segue.destinationViewController as? TaskDetailViewController {
    let selectedRow = tableViewTasks.indexPathForSelectedRow?.row { 
        // let incompleteTask = list.incompleteTask[selectedRow] 
        // let completeTask = list.completeTask[selectedRow] 
        // destination.task = list.tasks[selectedRow] 
    }
}

您应该检查 tableViewTasks.indexPathForSelectedRow 是否存在,而不是该行是否存在,因此请更改:

let selectedRow = tableViewTasks.indexPathForSelectedRow?.row {

if let selectedIndexPath = tableViewTasks.indexPathForSelectedRow {

然后检查部分以查看您想要的数组和行以查看您想要的索引:

if selectedIndexPath.section == 0 {
    destination.task = list.completedTasks[selectedIndexPath.row]
} else {
    destination.task = list.incompleteTasks[selectedIndexPath.row]
}

【讨论】:

  • 谢谢@Sam。你建议我在哪里创建不同的数组?在 List 类中?我这样做了,它非常适合显示数据,但现在从 prepareForSegue 访问视图是我遇到问题的地方。
  • 是的,在列表类中工作正常。您能否详细说明您的 prepareForSegue 问题,或者如果它不相关,您可以发布另一个问题
  • 这是 prepareForSegue 的样子:if let destination = segue.destinationViewController as? TaskDetailViewController, let selectedRow = tableViewTasks.indexPathForSelectedRow?.row { // let incompleteTask = list.incompleteTask[selectedRow] // let completeTask = list.completeTask[selectedRow] // destination.task = list.tasks[selectedRow] }
  • 啊,在这里您需要再次检查该部分。因此,您应该只检查 indexPathForSelectedRow,而不是 indexPathForSelectedRow?.row。从这里您可以将部分检查为 selectedRow.section 并将索引作为 selectedRow.row (可能需要更改命名约定)
  • 我已经编辑了我的原始帖子以更详细地展示这一点
【解决方案2】:

我将假设您有两张表,一张用于完成的任务,一张用于未完成的任务。您需要做的可能与此类似:

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {
            return list.tasks.count
        } else {
            return lists.completedTasks.count
        }
    }

然后在cellForRowAtIndexPath 中,您应该使用相关信息设置单元格。您可以从该函数的 indexPath 变量中获取节和行,并根据需要使用该信息设置单元格。

【讨论】:

  • 不,我只有一张桌子和多个部分。我尝试将 List 类中的属性从 var tasks = [Task]() 更改为:// var tasks = [Task]() var completeTask = [Task]() var incompleteTask = [Task]() 但这会导致我稍后在任务详细信息视图中尝试访问此任务时出现更多问题。
【解决方案3】:

在您的数据源方法tableView(_: numberOfRowsInSection:) 中,您应该根据节索引返回不同的值;例如:

if section == 0 {

    return activeTasks.count
}
else if section == 1 {

    return completedTasks.count
}
else {

    return 0 // Error - should never happen
}

(假设您将已完成的任务和未完成的任务保存在两个单独的数组中)

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多