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

时间:2012-06-13 12:57:55

标签: ios uitableview uistoryboard

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

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

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

此致

- 约翰

2 个答案:

答案 0 :(得分:1)

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

调用操作时,您的发件人将成为子类,您可以在那里访问添加的代码。

我不知道是否是这种情况,但如果您只是尝试更改某个值,则应在创建对象时使用将switch值绑定到属性。甚至不需要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:方法创建单元格。然后你可能应该使用绑定来将你的价值放到正确的位置。

答案 1 :(得分:0)

我没有添加单独的子类,而是将行存储在每个按钮的“禁用标题”属性中。这非常有效。第一个代码在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];
}

这对我有用。