IOS / Objective-C:检测按钮按下Custom Tableview Cell?

时间:2017-10-29 15:48:43

标签: ios objective-c uitableview custom-cell

对于Feed视图控制器,我有一个tableview,其中包含一些自定义单元格,其中包含like,comment和share按钮我想根据按下的按钮执行不同的操作。

我最初的想法是简单地将故事板中自定义单元格中的按钮连接到自定义单元格中的操作方法。但是,我对自定义单元格.m文件中的方法如何与View Controller中的TableView进行交互感到困惑。

player.sprite.getX() * scale

任何人都可以澄清是否可以在故​​事板中连接单元格中的按钮以及如何使用viewcontroller,cellforrowatindexpath和didselectrowatindexpath上的委托方法进行播放?

或者,如果这不是正确的方法,那么我们会对更好的方法提出任何建议。提前感谢任何建议。

2 个答案:

答案 0 :(得分:4)

您可以使用 delegate 来代替使用tagsblocksBlocksdelegate模式更容易使用,并且推荐使用。

Swift中,您将看到closures (blocks in Objective-C)的广泛使用,而不是任何其他模式。

示例:

<强> 1。 UITableViewDataSource方法

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    cell.likeButtonTapHandler = ^{
        NSLog(@"Like Button Tapped");
        //ADD YOUR CODE HERE
    };
    cell.commentButtonTapHandler = ^{
        NSLog(@"Comment Button Tapped");
        //ADD YOUR CODE HERE
    };
    cell.shareButtonTapHandler = ^{
        NSLog(@"Share Button Tapped");
        //ADD YOUR CODE HERE
    };
    return cell;
}

<强> 2。自定义UITableView单元

@interface TableViewCell : UITableViewCell

@property (nonatomic, copy) void(^likeButtonTapHandler)(void);
@property (nonatomic, copy) void(^commentButtonTapHandler)(void);
@property (nonatomic, copy) void(^shareButtonTapHandler)(void);

@end

@implementation TableViewCell

- (IBAction)likeButtonTapped:(UIButton *)sender
{
    self.likeButtonTapHandler();

}

- (IBAction)commentButtonTapped:(UIButton *)sender
{
    self.commentButtonTapHandler();
}

- (IBAction)shareButtonTapped:(UIButton *)sender
{
    self.shareButtonTapHandler();
}

答案 1 :(得分:1)

你可以用两种方式做到这一点。优选地,第一个记住Objective-C设计模式。

  • 使用委托模式

    您可以向视图控制器发送一个回调,传递Button id(可以是标签或枚举)和单元格对象,并处理那里的内容。

  • 根据indexPath

    使用标记

    例如,如果您只有行而没有列,那么您可以根据行号和按钮类型分配按钮标签,如果您有行和部分,则可以按行和部分编号分配标记然后分配选择器到CellForRowAtIndexPath中的按钮,然后您可以通过解码sender

  • 标签来获取行号

现在,扩展第一种方法,无需获得按钮的位置。只需调用该按钮的委托方法,该方法将在ViewControler中观察。

在自定义单元格类中。

@protocol YourCellButtonsDelegate <NSObject>
@optional
- (void)likeButtonTappedForCell:(UITableViewCell *)cell;
- (void)commentButtonTappedForCell:(UITableViewCell *)cell;
- (void)shareButtonTappedForCell:(UITableViewCell *)cell;
@end

@interface YourCell : UITableViewCell
@property (nonatomic, weak) id <YourCellButtonsDelegate> buttonsDelegate;
@end

Like按钮的Action方法示例如下。

- (IBAction)likeButtonPressed:(id)sender {
    [self.buttonsDelegate likeButtonTappedForCell:self];
}

在初始化并分配给YourCell后,在ViewController方法的CellForRowAtIndex类中,按以下方式分配代理

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"YourCellIdentifier";

    YourCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    //do your stuffs here.
    cell.delegate = self
}

并按如下方式实现委托方法。

- (void)likeButtonTappedForCell:(UITableViewCell *)cell {
   NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
   //you can get the row from the indexPath here.

}

不要忘记在ViewController类中确认委托。