点击单元格附件

问题描述:

我有一个自定义单元格的UITableView。通常,当用户点击该单元格,它会触发该功能:点击单元格附件

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

如果这种观点,他们标记为完成,当他们返回的代码将添加标准检查附件的单元格。

当单元格没有完成时,我想要一个空的检查点,可以点击(我知道我可以添加一个自定义图像附件),点击允许用户跳过segue并快速标记单元格完成后。但我似乎无法使双方的工作:

  1. 轻敲细胞的主体应该调用didSelectRowAtIndexPath方法
  2. 轻敲附件视图(空复选标记)应该调用一组不同的代码。

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

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

是否有可能点击主体触发一组代码并点击附件视图触发另一个?如果是这样,怎么样?

您应该为您的自定义UITableViewCell添加一个UIButton。然后,您可以添加一个目标,这个按钮叫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的标签只有在表格有一个部分时才会起作用。

另一种选择可能会使用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] 
} 
+0

但这里的有关手动添加一个按钮,像一个附件的东西......纲领性添加附件的是伟大的!它的尺寸没有拉伸和垂直居中。添加附件甚至可以调整细胞的主体。对我来说最重要的是,在某些情况下,表应该没有配件所以很高兴有它是一个简单的开关加载。没有办法添加配件图像视图并使其可点击? –

+0

您可以设置按钮,是小区的accessoryView的,但你需要像我上述设定目标的方式相同。 AccessoryView是UITableViewCell上的一个读写UIView属性。你应该知道,如果设置accessoryView的设置accessoryType被忽略,因此,如果你想使用UITableViewCellAccessoryCheckmark在按钮的动作,你不得不重新装入电池,并设置accessoryView的为零和accessoryType到UITableViewCellAccessoryCheckmark和就没有办法因为UITableViewCellAccessoryCheckmark不响应水龙头,所以用户可以将该操作逆转 – beyowulf

其Objective-C解决方案。 如果您添加了自己的accessoryButton,那么将不会调用'accessoryButtonTappedForRowWithIndexPath'的tableviewDelegate方法。 你应该做的是,为该方法创建一个UIButtonaddTarget,然后将其作为accessoryButton添加到tableViewCell。还要将tag的值设置为index path.row,以便您了解哪个行被点击。

我选择,我想给一个完整的答案回答,以及我帮助了。但是,我从回答有点偏离,并希望分享这还有:

使附属视图出现/消失

我几个列表加载到同一个故事板表。有时列表应显示指标,其他时间则不需要配件。为此,我在故事板中添加了一个按钮,垂直居中,尾部= 0到正确的容器视图。然后我给它的宽度为0,并在我的代码中给这个约束一个IBOutlet。当我需要配件时,我只是简单地给它一个宽度。为了使它消失,我将其宽度设置回0。

配件和核心数据

配件是一种痛苦,因为如果用户检查过的东西然后关闭该应用程序,他们希望它被人记住。因此,对于每个更改,都需要将该单元状态保存在CoreData中。我添加了一个名为“状态”的属性,并在配件显示填满时给它一个“已选择”的值。

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