我可以使用UIButton的动作方法获取第二个参数吗?

时间:2014-04-18 23:56:03

标签: ios objective-c uibutton

我想在表格的每个单元格中放置一个按钮。我希望目标是一个我用来处理所有API调用的类。 我希望按钮的方法在friendController类中,而不是在UITableView的视图控制器中。

[cell.deleteButton addTarget:friendController 
action:@selector(deleteFriend: forID:cell.idNumber) 
forControlEvents:UIControlEventTouchUpInside];

其中friendController是具有API调用的类,而cell.idNumber是每个单元格的实例变量,包含与该单元格关联的用户的ID号。

我知道(好吧,我认为)我可以将单元格本身设置为目标,然后有一个看起来像这样的方法:

-(IBAction)deleteFriend:(id)sender {
    [friendController deleteFriend:self.idNumber];
}

这是对的吗?它似乎不是一种优雅的方式。有没有办法按照我想要的方式去做,或者有更好的方法吗?

编辑:我鼓舞了问题的最后一个关键部分。我希望按钮的动作是另一个类(friendController)中的方法。 friendController是我创建的一个类,用于存放所有API调用和业务逻辑。 如果我将目标设置为friendController,那么该动作必须是该类中的方法吗?

4 个答案:

答案 0 :(得分:3)

你可以这两种方式。

子类化UIButton

第一个是子类UIButton并为idNumber创建一个属性。所以你首先设置属性如下:

cell.deleteButton.idNumber = /* set id here */
[cell.deleteButton addTarget:friendController 
action:@selector(deleteFriend:) 
forControlEvents:UIControlEventTouchUpInside];

然后在deleteFriend:方法中访问它:

- (IBAction)deleteFriend:(id)sender {
    YourButtonClass *button = (YourButtonClass *)sender;
    [friendController deleteFriend:button.idNumber];
}

直接从单元格

中检索idNumber

this post中描述,您可以获取按钮的单元格的索引路径,然后从那里访问idNumber

答案 1 :(得分:0)

使用2个参数指示发送消息的控件和触发消息的事件:

action:@selector(buttonAction:Second:)

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn addTarget:self action:@selector(buttonAction:Second:) forControlEvents:UIControlEventTouchUpInside];
}

- (void)buttonAction:(NSString *)firstCharacter
              Second:(NSNumber *)second
{

}

答案 2 :(得分:0)

使用按钮的tag属性。

cell.deleteButton.tag = cell.idNumber;
[cell.deleteButton addTarget:friendController action:@selector(deleteFriend:) forControlEvents:UIControlEventTouchUpInside];

在该方法中,您可以使用标记来检索单元格idNumber

-(IBAction)deleteFriend:(id)sender {
     int idNumber = ((UIButton *) sender).tag;
     [friendController deleteFriend: idNumber];
} 

答案 3 :(得分:0)

由于该按钮位于UITableViewCell内,因此您可以考虑使用属性idNumber(我不喜欢重用Tag,因为它只能是一个整数)和委托来子类UITableViewCell:

    @protocol MyTableViewCellDelegate;

@interface MyTableViewCell : UITableViewCell

@property (nonatomic, assign) NSInteger idNumber;

@property (nonatomic, weak) id<MyTableViewCellDelegate> delegate;

@end

@protocol MyTableViewCellDelegate <NSObject>

-(void) shouldDeleteFriendById:(NSInteger)idNumber;

@end

并处理MyTableViewCell实现中的按钮操作:

- (void) myInit
{
    UIButton* button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    [button addTarget:self action:@selector(onButtonClicked:) forControlEvents:UIControlEventTouchUpInside];

    [self addSubview:button];
}

- (IBAction)onButtonClicked:(id)sender
{
    [self.delegate shouldDeleteFriendById:self.idNumber];
}

然后在tableViewController中实现单元格的委托:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyTableViewCell *cell = (MyTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath];

    // Configure the cell...
    cell.idNumber = indexPath.row;
    cell.delegate = self;

    return cell;
}

- (void) shouldDeleteFriendById:(NSInteger)idNumber
{
    NSLog(@"should delete by id:%d", idNumber);
}