在 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?