我想在表格的每个单元格中放置一个按钮。我希望目标是一个我用来处理所有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,那么该动作必须是该类中的方法吗?
答案 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);
}