在 tableView 上使用 CustomCell,如何调用 didSelectRowAtIndexPath?

Posted

技术标签:

【中文标题】在 tableView 上使用 CustomCell,如何调用 didSelectRowAtIndexPath?【英文标题】:Using CustomCell on tableView, how can I get didSelectRowAtIndexPath called? 【发布时间】:2011-07-15 01:22:58 【问题描述】:

我正在使用 CustomCells 填充 UITableView,并且正在尝试调用 didSelectRowAtIndexPath。这是自定义单元格的标题。

#import <UIKit/UIKit.h>

@interface CustomCell : UITableViewCell 
    IBOutlet    UILabel         *bizNameLabel;
    IBOutlet    UILabel         *addressLabel;
    IBOutlet    UILabel         *mileageLabel;
    IBOutlet    UIImageView     *bizImage;


@property (nonatomic, retain) UILabel     *bizNameLabel;
@property (nonatomic, retain) UILabel     *addressLabel;
@property (nonatomic, retain) UILabel     *mileageLabel;
@property (nonatomic, retain) UIImageView *bizImage;
@end

非常简单明了。我有一个 detailDisclosureButton,我也在单元格的 cellForRowAtIndexPath 方法中添加到单元格中,并且正在调用方法 accessoryButtonTappedForRowWithIndexPath:,但没有调用 didSelectRowAtIndexPath。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    static NSString *CellIdentifier = @"CustomCell";

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCellView" 
                                                     owner:self options:nil];

#ifdef __IPHONE_2_1
        cell = (CustomCell *)[nib objectAtIndex:0];
#else
        cell = (CustomCell *)[nib objectAtIndex:1];
#endif
    

    // Configure the cell.
    NSDictionary *dict = [rows objectAtIndex: indexPath.row];

        /*
          CODE TO POPULATE INFORMATION IN CUSTOM CELLS HERE
       */

#ifdef __IPHONE_3_0
    cell.accessoryType =  UITableViewCellAccessoryDetailDisclosureButton;
#endif

    return cell;

我在所有方法和断点中都放置了一个 NSLog。我试图调用的方法不是,但在我的 CustomCell 类中,以下方法是。那么有没有办法让 didSelectRowAtIndexPath 在使用 CustomCell 时被调用?

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 

【问题讨论】:

你的 UITableView 是 IBOutlet 吗?如果是这样,那么你应该像 aTableView.delegate = self 一样设置委托。 在 IB 中,数据源和委托出口都连接到文件的所有者。 theTableView 引用出口也连接到文件的所有者。 顺便说一句,我对你支持 ios 2.1 感到震惊。你是一个比我更好的人。 @CABearsfan 你能解决这个问题吗? 【参考方案1】:

自定义单元格与否应该没有任何区别。你在编辑模式吗?如果是,则必须在 tableView 上设置allowsSelectionDuringEditing = true

【讨论】:

自定义单元格是我能想到的。我设置了一个新的视图控制器,并且只插入了示例教程中的默认值,以确保它可以正常工作,并且效果很好。一旦我创建了自己的业务数组并更改了 cellForRowAtIndexPath 的内容,该方法就不再有效。不知道为什么... 也只是为了确保这一点,我将以下代码行放入 cellForRowAtIndexPath theTableView.allowsSelection = TRUE; theTableView.allowsSelectionDuringEditing = TRUE;仍然无法调用 didSelectRowAtIndexPath 方法。 另外,由于 - (void)setSelected:(BOOL)selected animated:(BOOL)animated 在 CustomCell 类中被调用,有没有办法将它传递给 tableView,或者解决我需要的方法没有被使用这个方法调用的事实?我尝试通过将 NSString 的值设置为 self.bizNameLabel.text 来让它在单元格中显示企业名称,但出现空白。 谢谢 smparkes,自从 2 小时以来就为这个问题生气了。在我的情况下启用了编辑模式。谢谢你的提示【参考方案2】:

如果您在 xib 中使用 Tableview..所以您想在文件所有者中提供 tableview 的数据源和委托连接..

【讨论】:

我在我的 xib 中将数据源和委托连接都设置为文件所有者。 TableView 也作为引用出口连接到文件的所有者 另外,由于 - (void)setSelected:(BOOL)selected animated:(BOOL)animated 在 CustomCell 类中被调用,有没有办法将它传递给 tableView,或者解决我需要的方法没有被使用这个方法调用的事实?我尝试通过将 NSString 的值设置为 self.bizNameLabel.text 来让它在单元格中显示企业名称,但出现空白。 使用 cell.bizNameLabel.text=@"string"; 我正在寻找一种方法来检索单元格中公司名称的值,而不是设置它。 好的,试试吧.. yourstring=((CustomCell*)[tableView cellForRowAtIndexPath:indexPath]).bizNameLabel.Text【参考方案3】:

既然你说tableView:accessoryButtonTappedForRowWithIndexPath: 被调用,我们知道你的tableView 的delegate 属性设置正确。所以tableView:didSelectRowAtIndexPath: 也应该被调用。如果它没有被调用,我最好的猜测是你在方法签名的某个地方有一个错字。将此方法签名复制并粘贴到您的代码中,以确保您没有意外省略“tableView:”部分或出现大写错误。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

编辑:次要假设:在您定义自定义单元格的 .xib 中,确保选中“启用用户交互”。

【讨论】:

我知道没有理由不调用它,这就是我如此困惑的原因。键入是正确的,因为当我使用标准预建数组填充表格时没有自定义单元格,它触发没有问题。一旦我将它更改为基于我的 JSON 返回构建的数组并使单元格类型 CustomCell 不再调用该方法。这是下面的电话,由于字符限制,我无法将其放在这里 清洁工- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath NSLog(@"Row Tapped"); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Row Tapped" message:@"Success!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; 嗯...好的,我在上面编辑了我的答案,你可以检查一下。 是的,确实检查了启用的用户交互。就像我说的,在我将输入单元格的数据从我输入的数组更改为我从 php 调用返回 JSON 时得到的数据之前,它运行良好。一旦我更改了要显示的数据并将其设置为自定义单元格(这样我就可以按照我想要的方式对其进行格式化),它就会停止触发所需的方法 另外,由于 - (void)setSelected:(BOOL)selected animated:(BOOL)animated 在 CustomCell 类中被调用,有没有办法将它传递给 tableView,或者解决我需要的方法没有被使用这个方法调用的事实?我尝试通过将 NSString 的值设置为 self.bizNameLabel.text 来让它在单元格中显示企业名称,但出现空白。【参考方案4】:

检查您是否为 myTableView 的父视图设置了 UITapGestureRecognizer ..这可能超出了触摸事件并消耗它。

【讨论】:

以上是关于在 tableView 上使用 CustomCell,如何调用 didSelectRowAtIndexPath?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 UISplitView 在 TableView 上添加 NavigationController

在 tableView 上使用 CustomCell,如何调用 didSelectRowAtIndexPath?

在 tableView 上添加视图

使用 swift 2 在 tableview 上处理单元格

在单击Tableview Cell上使用哪种方法更新Rest Api数据

在 tableview 上添加视图