一个 IBAction 用于多个带有按钮的自定义原型单元

Posted

技术标签:

【中文标题】一个 IBAction 用于多个带有按钮的自定义原型单元【英文标题】:One IBAction for multiple custom prototype cells with buttons 【发布时间】:2012-06-13 12:57:55 【问题描述】:

使用情节提要,我有一个包含多个动态原型单元的表格视图控制器。其中一个单元格是一个自定义动态原型单元格(我为其创建了一个子类),其中包含一个标签和一个开关。我将开关的操作连接到视图控制器中的操作方法(比如 switchChanged:)。在 cellForRowAtIndexPath 中,我配置并返回适合指定索引的单元格。到目前为止一切顺利。

问题:我的应用程序有多个这些自定义单元格的实例,那么我如何区分哪个开关发生了变化?一个想法是,在视图控制器中,我可以为每个单元格创建一个成员开关,并在第一次调用 cellForRowAtIndexPath 时将它们链接到特定的单元格开关。然后我可以使用这些成员开关与传递给 switchChanged: 的开关进行比较。

我知道我可以尝试它并立即获得答案,但我希望讨论其他开发人员如何做我想做的事情。这是最好/最差/好的方法吗?有哪些实用的替代方法?

问候,

--约翰

【问题讨论】:

【参考方案1】:

我曾经遇到过这种情况(不是开关,但我相信它同样适用)。我已经设法通过子类化对象类并在子类中添加所需的属性/方法来解决它。

调用操作时,您的发送者将是子类,您可以在那里访问您添加的代码。

我不知道是不是这样,但如果你只是想改变一个值,你应该在创建对象时使用将开关值绑定到属性。它甚至不需要 IBAction 来调用。

编辑:示例:

@interface MySwitch : UISwitch
@property (nonatomic, assign) NSUInteger someProperty;
@end

然后,每次创建单元格时,您都可以将“someProperty”设置为您想要的任何内容。

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
  // yada yada yada...
  UITableViewCell *cell;
  // yada yada yada...

  [cell.myLinkedSwitch  setSomeProperty:indexPath.row];
  return(cell);

除非您不使用tableView:cellForRowAtIndexPath: 方法创建单元格。那么您可能应该使用绑定将您的值放到正确的位置。

【讨论】:

我按照你所说的,它似乎只适用于自定义单元格的一个实例。但是如何区分多个单元实例的开关呢? 所以让我们看看我是否理解。我可以向子类添加一个属性,比如 instanceID。然后,我可以首先通过 cellForRowAtIndexPath 为每个单元格设置此属性。然后当 switchChanged: 被调用时,我可以使用 instanceID 来确定哪个开关改变了状态。看起来正确吗? 几乎!每次调用 cellForRowAtIndexPath 时,您将为每个单元格设置属性。如果您有 30 个单元格,则该函数将被调用 30 次。 感谢塞尔吉奥的帮助!像魅力一样工作!【参考方案2】:

我没有添加单独的子类,而是将行存储在每个按钮的 Disabled Title 属性中。这很有效。第一个代码在 CellForRowAtIndexPath 中:

NSString *strRow = [[NSString alloc] initWithFormat:@"%i",useRow];
[btnPreferredChk setTitle:strRow forState:UIControlStateDisabled];

然后我的按钮操作方法使用该值来执行适当的活动。

- (IBAction)goStorePick:(id)sender

  UIButton *useButton = [[UIButton alloc] init];
  useButton = sender;
  NSInteger *storeRow = [[useButton titleForState:UIControlStateDisabled] integerValue];

  NSString *CMIMsg = [[NSString alloc] initWithFormat:@"goStorePick Method Executed at Row: %i", storeRow];

  [self shwMessage:CMIMsg];

这对我很有效。

【讨论】:

以上是关于一个 IBAction 用于多个带有按钮的自定义原型单元的主要内容,如果未能解决你的问题,请参考以下文章

在主视图控制器的自定义单元格中使用来自 UIButton 的 IBAction

UIbutton不改变IBAction内的背景

自定义 UIButton - IBAction 不起作用

Summernote - 多个编辑器实例上的自定义按钮

自定义 UITableViewCell 中按钮上的 IBAction

带有自定义后退导航按钮的自定义按钮栏