按下按钮时需要访问 UITableViewCell 的 detailTextLabel 属性

Posted

技术标签:

【中文标题】按下按钮时需要访问 UITableViewCell 的 detailTextLabel 属性【英文标题】:Need to access detailTextLabel property of UITableViewCell when button is pressed 【发布时间】:2014-02-26 01:34:38 【问题描述】:

我以编程方式创建了一个 UITableView,并且我还以编程方式创建了 UIButtons 以包含在每个单元格/行中。我已经设置了这些按钮,这样如果它们被点击,它们的按钮图像就会改变。因此,当用户第一次看到表格视图时,按钮是灰色的,但如果用户点击其中一个按钮,那么该按钮将变为红色。如果他们再次点击它,它会变回灰色。

我需要这样做,如果一个按钮被按下,并且当前正在使用红色图像,那么它将把它的单元格的 detailTextLabel 属性值传递给一个 NSMutableArray 对象。

这是我控制大部分 UITableView 的代码。这是设置单元格的 textLabels 和 detalTextLabels 的位置:

userName = [self.potentiaFriendsInParseFirstNamesArray objectAtIndex:indexPath.row];

NSString *firstNameForTableView = [self.potentiaFriendsInParseFirstNamesArray objectAtIndex:indexPath.row];

NSString *userNameForTableView = [self.potentiaFriendsUsernameArray objectAtIndex:indexPath.row];

UIImage *addUserButtonImage = [UIImage imageNamed:@"SliderThumb-Normal-G"];

UIImage *addUserButtonImageHighlighted = [UIImage imageNamed:@"SliderThumb-Normal"];

UIButton *addUserButton = [[UIButton alloc]init];

addUserButton.frame = CGRectMake(237, -10, 64, 64);

[addUserButton setImage:addUserButtonImage forState:UIControlStateNormal];

[addUserButton setImage:addUserButtonImageHighlighted forState:UIControlStateHighlighted];

[addUserButton setImage:addUserButtonImageHighlighted forState:UIControlStateSelected];

[addUserButton addTarget:self action:@selector(handleTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];

[cell.textLabel setText:firstNameForTableView];

[cell.detailTextLabel setText:userNameForTableView];

[cell.contentView addSubview:addUserButton];

上述代码中最重要的部分是这些语句:

[addUserButton setImage:addUserButtonImage forState:UIControlStateNormal];

[addUserButton setImage:addUserButtonImageHighlighted forState:UIControlStateHighlighted];

[addUserButton setImage:addUserButtonImageHighlighted forState:UIControlStateSelected];

以上控制按钮不同状态的设置,这有助于使按钮在按下时变为灰色图像或红色图像。

下面的语句是一个处理“触摸”事件的方法调用,使按钮在按下时从灰色图像变为红色图像:

[addUserButton addTarget:self action:@selector(handleTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];

这是我的视图控制器中上述方法的方法实现:

- (void)handleTouchUpInside:(UIButton *)sender 
    sender.selected = !sender.selected;

    NSLog(@"Has sender state changed?: %u", sender.state);   

你会注意到我正在使用 NSLog 来打印按钮的状态。每次按下按钮之一时,“状态”属性都会更改其值。现在我需要找到一种方法来实现它,以便如果特定按钮的状态发生更改,我们将获取它的单元格的“detailTextLabel”属性并将其放置在 NSMutableArray 中。

【问题讨论】:

【参考方案1】:

你可以使用addUserButton.tag属性来保持tableview的索引行(1),所以在handleTouchUpInside(2)里面你可以找到按钮行:

1- 在 cellForRowAtIndexPath 函数中设置 indexPath 行

//Keep indexPath.row on Button.tag
addUserButton.tag = indexPath.row

2- TableView 行上的查找按钮

- (void)handleTouchUpInside:(UIButton *)sender 
    UIButton *cellButton = (UIButton *)sender;
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:cellButton.tag inSection:0];

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    cell.detailTextLabel.text = @"teste";


我希望它有效。

【讨论】:

我添加了你的代码,它根本没有改变任何东西。 您是否在 addUserButton 创建时设置了标签属性,然后将其添加到单元格子视图? 你是在问我,如果在我发布的原始代码中,我是否向我的 UIButton 对象添加了一个名为“addUserButton”的标签属性? 现在看看答案,我用标签属性补充了它 我将其更改为 indexPath 的 row 属性,现在它可以正常工作了。谢谢卡兰特斯!【参考方案2】:

这是您如何将 UITableViewCell 子类化以完成此操作的精髓(稍微压缩以节省空间...)首先是 .h

#import <UIKit/UIKit.h>

@interface SampleCell : UITableViewCell
@property (nonatomic, assign) id delegate;
@end


@protocol FancyProtocolNameGoesHere
- (void)doSomethingWithThisText:(NSString*)text fromThisCell:(UITableViewCell*)cell;  
@end

还有.m

#import "SampleCell.h"

@interface SampleCell ()

@property (strong, nonatomic) UIButton *button;
- (void)handleTouchUpInside;

@end


@implementation SampleCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) 
        [self configureCell];
    
    return self;
 

- (void)configureCell

    _button = [[UIButton alloc] init];
    //Configure all the images etc, for the button
    [_button addTarget:self action:@selector(handleTouchUpInside) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:_button]; //you'd probably want to set the frame first...


- (void)handleTouchUpInside

    if (_button.selected) 
        [self.delegate doSomethingWithThisText:self.textLabel.text fromThisCell:self];
    
    _button.selected = !_button.selected;


@end

向TableView注册这个子类(记得声明符合协议),并在-(UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath*)indexPath内将delegate分配给self

当你实现- (void)doSomethingWithThisText:(NSString*)text fromThisCell:(UITableViewCell*)cell; 时,最后的魔法就来了,因为你可以在你传入的单元格参数上调用[self indexPathForCell:cell] 来获取你可能需要的索引路径,这样你就知道在你的 NSMutableArray 数据对象中插入文本的位置。

具有委托协议模式的子类 UITableViewCell 不是这样做的唯一方法,但我认为这对您所描述的内容有些意义。

【讨论】:

【参考方案3】:

此解决方案对于表格部分是安全的。

- (void)onButtonPressed:(UIButton *)sender event:(id)event

    CGPoint point = [[[event allTouches] anyObject] locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForItemAtPoint:point];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    /* use cell here */

【讨论】:

对不起,我很困惑。 “安全到餐桌部分”是什么意思? 如果你要使用按钮的标签值,你只能分配row。如果只知道行,您如何检测哪个sectionrow 被按下?我的解决方案,你不知道rowsection(完整索引路径)用于检测单元格。

以上是关于按下按钮时需要访问 UITableViewCell 的 detailTextLabel 属性的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 中的按钮 [重复]

当我按下 uitableviewCell 内的信息按钮时添加模式视图控制器

获取 UIButton 的 UITableViewCell?

在自定义 UITableViewCell 中按下 UIButton 时如何获取 indexPathForSelectedRow

帮助! uitableviewcell 按钮按下更新文本字段

如何从 UITableViewCell 中的自定义 UIButton 中删除触摸延迟