按下按钮时需要访问 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
。如果只知道行,您如何检测哪个section
和row
被按下?我的解决方案,你不知道row
和section
(完整索引路径)用于检测单元格。以上是关于按下按钮时需要访问 UITableViewCell 的 detailTextLabel 属性的主要内容,如果未能解决你的问题,请参考以下文章
当我按下 uitableviewCell 内的信息按钮时添加模式视图控制器
获取 UIButton 的 UITableViewCell?
在自定义 UITableViewCell 中按下 UIButton 时如何获取 indexPathForSelectedRow