如何从 UITableViewCell 中获取价值

Posted

技术标签:

【中文标题】如何从 UITableViewCell 中获取价值【英文标题】:How to get value from UITableViewCell 【发布时间】:2013-12-03 09:36:19 【问题描述】:

我在 uitableviewcell 中获取值时遇到问题。

首先,我的单元格上有一个标签,我在其上创建了一个点击手势。我想要做的是在点击该标签时,将调用 viewUser 方法,它将获取被点击的单元格的详细信息。

这是我的代码:

在 cellForRowAtIndexPath 上:

cell.userNameLabel.text = [[_workflowList objectAtIndex:indexPath.row] userName];

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewUser:)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[cell.userNameLabel addGestureRecognizer:tapGestureRecognizer];
cell.userNameLabel.userInteractionEnabled = YES;

现在,当我调用 viewUser 的 ontap 方法时:

- (IBAction)viewUser:(id)sender 

//this should not be hard coded
//data should come from cell.
//usernamelabel or i will get the index selected 
//and get the details in my array 
// like this --> [_workflowList objectAtIndex:index]

WorkflowProfileViewController *chkDtl = [[WorkflowProfileViewController alloc]init];
chkDtl.name = @"USER, USER USER"; ;
chkDtl.phoneNo = @"09173210836";
chkDtl.email = @"romelync@sxchange.com";
[self.navigationController pushViewController:chkDtl animated:YES];

请帮帮我。

【问题讨论】:

你没有。您永远不应该将数据存储在单元格中。您将它存储在一个数组中,然后填充单元格。 什么是部署目标? 是的,如您所见,我所指的数据是我的数组_workflowList 中的数据。我要说的是如何直接从所选单元格中获取它,或者如何获得所选单元格的索引。我想我已经解释得很好了。 【参考方案1】:

最好的选择是使用 UITableView 委托方法 tableView:didSelectRowAtIndexpath: 如下:

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    WorkflowProfileViewController *chkDtl = [[WorkflowProfileViewController alloc]init];
    chkDtl.name=[[_workflowList objectAtIndex:indexPath.row] userName];
    [self.navigationController pushViewController:chkDtl animated:YES];

别忘了设置你的 tableView 的委托。

更新:那么我认为你想做如下的事情。在你的 cellForRowAtaIndexPath: 添加以下内容:

cell.userNameLabel.tag=indexPath.row;

在 viewUser 方法中:

UITapGestureRecognizer *tap=(UITapGestureRecognizer*)sender;
WorkflowProfileViewController *chkDtl = [[WorkflowProfileViewController alloc]init];
chkDtl.name=[[_workflowList objectAtIndex:tap.view.tag] userName];
[self.navigationController pushViewController:chkDtl animated:YES];

【讨论】:

使用 didSelectRowAtIndexPath 不是我的解决方案:(【参考方案2】:

创建 UILable 时,您可以将标签值作为行号

lable.tag = indexPath.row

然后在您的方法中检索标签并查找标签值。

【讨论】:

嗨,@Ihencq,这个答案对你有帮助吗?如果是,请除了回答,如果不是,请告诉我建议有什么问题。【参考方案3】:

类似下面的内容将获取您正在点击的单元格(用点击替换滑动):

- (void)handleSwipeRight:(UISwipeGestureRecognizer *)gestureRecognizer
    CGPoint location = [gestureRecognizer locationInView:self.tableView];
    NSIndexPath *swipedIndexPath = [self.tableView indexPathForRowAtPoint:location];
    self.currentSwipedCell  = [self.tableView cellForRowAtIndexPath:swipedIndexPath];

 

还没有测试过,但是:

-(void)viewUser:(UITapGestureRecognizer):gestureRecognizer
    CGPoint location = [gestureRecognizer locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
    self.currentTappedCell  = [self.tableView cellForRowAtIndexPath:indexPath];
    NSLog(self.currentTappedCell.name); // If you have a custom cell with a name property

【讨论】:

但我不能,我不应该刷单元格。它应该只点击标签本身。 :( 这个答案很好,但不是保存单元格,而是使用新的 indexPath 从 self.workflowList 获取信息 我同意马克·莫斯比的观点【参考方案4】:

当然,您应该使用正确的委托方法,而不是在 UITableViewCell 上实现 UITapGestureRecognizer。然后你可以很容易地得到你想要的信息:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    NSString *theUserNameYouWantToGet = [_workflowList objectAtIndex:[indexPath row]];

编辑:

如果您希望该操作不适用于整个单元格,您可以将UITableViewCell 子类化,为其添加属性并为该单元格实现您自己的委托协议:

@protocol JWTableViewCellDelegate;
@interface JWTableViewCell : UITableViewCell
@property (nonatomic, retain) NSString *username;
@property (nonatomic, assign) id<JWTableViewCellDelegate>delegate;
@end
@protocol JWTableViewCell <NSObject>
- (void)tableViewCellDidClickUsername:(JWTableViewCell *)cell;
@end

@implementation JWTableViewCell
- (void)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) 
        [self setupView];
    
    return self;

// if you use a prototyping NIB
- (void)awakeFromNib 
    [self setupView];

- (void)setupView 
    // add gesture recognizer

- (void)handleGesture 
    if ([_delegate respondsToSelector:@selector(tableViewCellDidClickUsername:)]) 
        [_delegate tableViewCellDidClickUsername:self];
    

然后在你的 viewController 中使用它:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    JWTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseID" forIndexPath:indexpath];
    [cell setUsername:@"Paul"];
    [cell setDelegate:self];

- (void)tableViewCellDidClickUsername:(JWTableViewCell *)cell 
    NSString *theUserNameYouWantToGet = [cell username];

 

【讨论】:

如果他想要“选择单元格”和“选择单元格上的按钮”的不同操作怎么办 它不应该点击整个单元格,只点击标签。实际上我那里还有其他标签,我没有包括它,因为我认为它不再需要了:( 好的,你写了“[...]那个单元格被点击了。”所以我误解了这个问题。要编辑...

以上是关于如何从 UITableViewCell 中获取价值的主要内容,如果未能解决你的问题,请参考以下文章

如何快速从 UITableViewCell 动态中获取文本字段的值?

如何从 Cell 中获取 UITableViewCell indexPath?

Swift - 如何从单元格内单击 UIImageView 上的自定义 UITableViewCell 获取行数据

如何从 UITableViewCell 输入新视图? (当表格视图从 .plist 获取其信息时)

如何从自定义 UITableViewCell 获取值到 ViewController?

从UITableViewCell类中获取UITextView中的hashtag后尝试进行segue