点击手机配件
Tap on Cell Accessory
我有一个带有自定义单元格的 UITableView。通常当用户点击单元格时,会触发这个函数:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//Segue to another view
}
如果他们在该视图中将单元格标记为已完成,则当他们return代码将添加标准检查附件时。
当单元格未完成时,我想要一个可以点击的空支票(我知道我可以添加自定义图像附件),点击允许用户跳过 segue 并快速标记细胞完成。但我似乎无法使两者都起作用:
- 点击单元格主体应调用 didSelectRowAtIndexPath
- 点击辅助视图(空复选标记)应该调用一组不同的代码。
我试过 accessoryButtonTappedForRowWithIndexPath 但它似乎甚至没有被调用。
func tableView(tableView: UITableView, accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath) {
//Shortcut code to change the cell to "finished"
}
是否可以点击主体触发一套代码,点击附属视图触发另一套代码?如果可以,怎么做?
它是一个 Objective-C 解决方案。
当您添加自己的 accessoryButton
时,不会调用 'accessoryButtonTappedForRowWithIndexPath' 的 tableviewDelegate
方法。
您应该做的是,为该方法创建一个 UIButton
和 addTarget
,然后将其作为 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"。
这也意味着我在检索列表时必须按该属性排序。如果您已经有一个排序描述符,您现在需要几个。
我有一个带有自定义单元格的 UITableView。通常当用户点击单元格时,会触发这个函数:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//Segue to another view
}
如果他们在该视图中将单元格标记为已完成,则当他们return代码将添加标准检查附件时。
当单元格未完成时,我想要一个可以点击的空支票(我知道我可以添加自定义图像附件),点击允许用户跳过 segue 并快速标记细胞完成。但我似乎无法使两者都起作用:
- 点击单元格主体应调用 didSelectRowAtIndexPath
- 点击辅助视图(空复选标记)应该调用一组不同的代码。
我试过 accessoryButtonTappedForRowWithIndexPath 但它似乎甚至没有被调用。
func tableView(tableView: UITableView, accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath) {
//Shortcut code to change the cell to "finished"
}
是否可以点击主体触发一套代码,点击附属视图触发另一套代码?如果可以,怎么做?
它是一个 Objective-C 解决方案。
当您添加自己的 accessoryButton
时,不会调用 'accessoryButtonTappedForRowWithIndexPath' 的 tableviewDelegate
方法。
您应该做的是,为该方法创建一个 UIButton
和 addTarget
,然后将其作为 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"。
这也意味着我在检索列表时必须按该属性排序。如果您已经有一个排序描述符,您现在需要几个。