点击手机配件

Tap on Cell Accessory

我有一个带有自定义单元格的 UITableView。通常当用户点击单元格时,会触发这个函数:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     //Segue to another view
}

如果他们在该视图中将单元格标记为已完成,则当他们return代码将添加标准检查附件时。

当单元格未完成时,我想要一个可以点击的空支票(我知道我可以添加自定义图像附件),点击允许用户跳过 segue 并快速标记细胞完成。但我似乎无法使两者都起作用:

  1. 点击单元格主体应调用 didSelectRowAtIndexPath
  2. 点击辅助视图(空复选标记)应该调用一组不同的代码。

我试过 accessoryButtonTappedForRowWithIndexPath 但它似乎甚至没有被调用。

func tableView(tableView: UITableView, accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath) { 
     //Shortcut code to change the cell to "finished"
}

是否可以点击主体触发一套代码,点击附属视图触发另一套代码?如果可以,怎么做?

它是一个 Objective-C 解决方案。 当您添加自己的 accessoryButton 时,不会调用 'accessoryButtonTappedForRowWithIndexPath' 的 tableviewDelegate 方法。 您应该做的是,为该方法创建一个 UIButtonaddTarget,然后将其作为 accessoryButton 添加到 tableViewCell。同时将按钮的 tag 值设置为 index path.row 以便您了解单击了哪一行。

您应该将 UIButton 添加到您的自定义 UITableViewCell。然后,您可以为该按钮添加一个名为 pressedFinished 的目标,方法是说 cell.button.addTarget(self, action: "finishedPress:", forControlEvents: .TouchUpInside) 或者在 pressedFinished 中你可以这样说:

func pressedFinished(sender:UIButton)
{
   let location = self.tableView.convertPoint(sender.bounds.origin, fromView: sender)
   let indexPath = self.tableView.indexPathForRowAtPoint(location)
   //update your model to reflect task at indexPath is finished and reloadData
}

使用标签通常不是一个好习惯,因为它们没有内在含义。此外,映射到 indexPath.row 的标签仅在 table 有一个部分时才有效。

另一个选项可能是使用 UITableViewRowAction:

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath:      NSIndexPath) -> [AnyObject]? {
  let rowAction : UITableViewRowAction
  if model[indexPath].finished
  {
      rowAction = UITableViewRowAction(style: .Normal, title: "Mark as Unfinished", handler: {(rowAction:UITableViewRowAction,indexPath:NSIndexPath)->() in
      //mark as unfinished in model and reload cell
      })
 }else{
      rowAction = UITableViewRowAction(style: .Normal, title: "Mark as Finished", handler: {(rowAction:UITableViewRowAction,indexPath:NSIndexPath)->() in
      //mark as finished in model and reload cell
      })
  }
  return [rowAction]
}

我选择了我认为给出了详尽答案并且对我有所帮助的答案。但是,我稍微偏离了那个答案,也想分享一下:

使附件视图出现/消失

我将多个列表加载到同一个故事板中 table。有时列表应该显示指示器,有时不需要附件。为此,我在情节提要中添加了一个按钮,垂直居中且尾部 = 0 到右侧容器视图。然后我给它一个 0 的宽度,并在我的代码中给这个约束一个 IBOutlet。当我想要配件时,我只需给它一个宽度。为了让它消失,我将它的宽度设置回 0。

附件和核心数据

附件是一种痛苦,因为如果用户勾选某些东西然后关闭应用程序,他们希望它被记住。因此,对于每一次更改,您都需要将单元格状态保存在 CoreData 中。我添加了一个名为 "state" 的属性,并在附件应显示为已填充时为其赋予值 "selected"。

这也意味着我在检索列表时必须按该属性排序。如果您已经有一个排序描述符,您现在需要几个。