UITableView 原型单元上的自定义附件视图未触发

Posted

技术标签:

【中文标题】UITableView 原型单元上的自定义附件视图未触发【英文标题】:Custom Accessory View on UITableView Prototype Cell Not Firing 【发布时间】:2013-03-20 17:15:48 【问题描述】:

我在情节提要的原型单元格上有一个自定义附件视图(UIButton)。当我单击该按钮时,不会调用点击的附件按钮的委托方法。如果我使用标准的披露按钮,它就可以正常调用。我假设我错过了某个地方的连接。有人知道在哪里吗?

【问题讨论】:

我正在使用 UITableViewCell 子类并在界面生成器中设计单元格。我不是从表视图控制器做的。我需要从那个子类中调用。 【参考方案1】:

猜一猜: 您实际上并没有“自定义附件视图”,而是将 UIButton 放置在附件所在的位置。这不会触发代理附件点击按钮,因为它不是真正的附件。

猜猜二: 你确实有一个真正的附件视图,但它永远不会得到“点击”事件,因为你有一个 UIButton 在它里面吃用户交互但不触发一个动作。在这种情况下,请尝试添加一个简单的UIView

除此之外,我需要更多信息。

【讨论】:

我尝试使用图像视图,但没有任何区别。该按钮连接到 UITableViewCell 的 accessoryView 属性。有没有办法从 UITableViewCell 子类以编程方式调用它? 在您的cellForRowAtIndexPath 中,获取单元格后,检查您的accessoryView 属性是否引用了您的视图,或者它是否为nil。如果在 IB 中设置正确,它应该存在。 我展示了按钮/视图/我在那里的任何东西。似乎它只处理它自己定义的附件视图类型的点击事件。而且似乎没有一种从表格单元格以编程方式进行的好方法。我最终使用了一个自定义协议,我会给出答案。【参考方案2】:

附件委托方法的苹果文档说

代理通常通过显示与所选行相关的新视图来响应对公开按钮(附件视图)的点击。为 indexPath 处的行设置辅助视图时,不会调用此方法。

所以自定义附件视图不会调用它。这是一种标准行为。

【讨论】:

【参考方案3】:

我最终使用自定义表格单元格的协议解决了这个问题。

CustomAccessoryTableCellDelegate.h

@protocol CustomAccessoryTableCellDelegate <NSObject>

     @required
     - (void) accessoryButtonTappedForCell: (UITableViewCell *) cell;

@end

CustomAccessoryViewTableCell.h

 @interface CustomAccessoryViewTableCell : UITableViewCell

      /** The custom accessory delegate. */
      @property (nonatomic, weak) id<CustomAccessoryTableCellDelegate> delegate;

 @end

CustomAccessoryViewTableCell.m

- (IBAction) buttonAction:(id)sender

    if ([self.delegate respondsToSelector:@selector(accessoryButtonTappedForCell:)]) 
        [self.delegate accessoryButtonTappedForCell:self];
    


表格视图控制器内部

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath

    CustomAccessoryViewTableCell *cell = [tableView
                         dequeueReusableCellWithIdentifier:@"MyCustomCell"];

    cell.label.text = @"Some Name";
    cell.delegate = self;

    return cell;
 

#pragma mark - Custom Accessory View Delegate

- (void) accessoryButtonTappedForCell:(UITableViewCell *)cell
    [self tableView:self.writerTable 
        accessoryButtonTappedForRowWithIndexPath: [self.writerTable
                                                      indexPathForCell:cell]];

【讨论】:

以上是关于UITableView 原型单元上的自定义附件视图未触发的主要内容,如果未能解决你的问题,请参考以下文章

更改单元格中的数据后,UITableView 中的自定义单元格将无法正确重新加载

无法将内容添加到 IB 视图控制器中的自定义表格视图单元格

UIStoryboard 中的自定义原型单元已创建,但未显示在 UITableView

UITableView 中的自定义单元格在滑动编辑后立即移动

使用带有原型单元的自定义 UITableViewCell

UITableView 可重用的自定义单元格在子视图中显示错误的内容