未调用自定义单元格 didSelectRowAtIndexPath
Posted
技术标签:
【中文标题】未调用自定义单元格 didSelectRowAtIndexPath【英文标题】:custom cell didSelectRowAtIndexPath not called 【发布时间】:2013-03-13 17:18:07 【问题描述】:我创建了一个通用的主从应用程序。我在自定义类(MasterViewController 类)中有一个表格视图。这是一个 UITableViewController 类。 使用 Storyboard,我在我的 iPhone 表格视图中创建了一个自定义单元格。自定义单元格包含 3 个标签和 1 个图像。 在 StoryBoard 中,此表视图数据源和委托设置为 MasterViewController 类。 我的自定义表格视图单元格在属性检查器的“视图”部分中具有“已启用用户交互”。 在我的 MasterViewController 类中,诸如“numberOfSectionsInTableView”之类的 UITableViewDataSource 方法运行良好。 我在表格视图和详细视图之间定义了一个序列。 当我运行应用程序并在表格视图中选择一个单元格时,不会为 iPhone 调用 didSelectRowAtIndexPath。我的 prepareForSegue 方法执行并发生了 segue。
我已经阅读了很多关于 didSelectRowAtIndexPath 未执行的帖子,但我无法解决我的问题。
任何提示将不胜感激。
我的自定义单元格标识符是 ConversationCell。 segue 标识符是 ShowConversationDetails。 我在 numberOfRowsInSection 的第一行使用断点进行调试,并且从未输入过此方法。
segue 有效,详细视图显示带有“Hello”文本的标签。
一些代码:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
//NSLog(@"Rows %lu",(unsigned long)[sectionInfo numberOfObjects]);
return [sectionInfo numberOfObjects];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"ConversationCell";
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
[self configureCell:cell atIndexPath:indexPath];
return cell;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
[[self.fetchedResultsController sections] count]);
NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
self.detailViewController.detailItem = object;
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier] isEqualToString:@"ShowConversationDetails"])
NSIndexPath *selectedIndex = [self.tableView indexPathForSelectedRow];
Event *e = nil;
e = [self.fetchedResultsController objectAtIndexPath:selectedIndex];
UIViewController *destinationViewController = [segue destinationViewController];
[segue.destinationViewController setLabel:@"Hello"];
主视图控制器: 这是我上面的界面;
@interface MasterViewController : UITableViewController <NSFetchedResultsControllerDelegate,ASIHTTPRequestDelegate,UITableViewDelegate, UITableViewDataSource>
NSMutableArray *eventsArray;
这可能是我的问题的线索。当我将以下代码添加到 prepareForSeque
NSIndexPath *selectedIndex = [self.tableView indexPathForSelectedRow];
NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:selectedIndex];
NSString *messageTableID = [[object valueForKey:@"messagetableid"] description];
selectedIndex 为空,就好像在执行 prepareForSeque 时不再选择行一样。
顺便说一句,为了安全起见,我从模拟器中删除了应用程序,然后对项目进行了清理,但没有任何改变。
提姆
【问题讨论】:
好吧好吧好吧,我怀疑你的单元格 - 'ConversationCell' 有一个位于顶部的视图,并且不会让触摸通过它传递到表格视图单元格。如果您正在进入 cellforRow、HeightForRowAtIndex 等方法,并且您说您在使用 DidSelectRowAtIndexPath 时遇到问题,那么它必须是由于最顶层的视图,它不会让触摸传递到单元格。您所能做的就是,只需将“SetUserInterActionEnabled:NO”设置为您在表格视图单元格上拥有的视图,然后通过点击行对其进行测试。不要关闭单元的交互。干杯。 :) 雷诺,感谢您的提示。我没有提到我为自定义单元格的每个元素取消选择“启用用户交互”。自定义单元格的交互保持开启。不幸的是,所有这些都完成后,没有调用 DidSelectRowAtIndexPath。 Remove all views or setHidden:TRUE for all views on your xib file of Cell,然后尝试构建,看看你是否能设法获得触摸? 【参考方案1】:除了您已经提到的检查之外,您可能还需要考虑以下其他一些检查:
检查方法是否正是这个(字母大小写没有区别):
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
检查控制器是否实现了UITableViewDelegate
协议
检查交互是否有效(更改选择样式选项,以便单元格在触摸事件时改变颜色)
检查您内部没有任何作为第一响应者的视图并取消交互(删除单元格中的任何视图以进行测试)
尝试以编程方式允许选择表格[tableView setAllowsSelection:YES];
【讨论】:
谢谢埃里克。我的 didSelectRowAtIndexPath 与您所说的完全一样。我检查了当我的单元格被选中时是否会调用 didHighlightRowAtIndexPath,它也没有被选中。看来,虽然我将 MasterViewController 设置为委托,但没有调用任何 UITableViewDelegate 方法。 然后尝试在 viewDidLoad 中以编程方式设置委托,只是为了安全起见 (tableView.delegate = self;) 谢谢埃里克。我之前尝试过,并且存在同样的问题。我添加了一些我在 prepareForSegue 中尝试过的代码,并注意到我无法确定选定的行。就好像行在到达 prepareForSeque 时不再被选中。我需要确定选择的行内容,以便将适当的值传递到详细信息页面。【参考方案2】:您确定您的UITableViewDelegate
对象被正确设置为表格视图的delegate
吗? (这与将其设置为数据源是分开的。)
【讨论】:
感谢您的反馈。 MasterViewController 设置为 dataSource 和 Delegate。【参考方案3】:我最终删除了我的 MasterViewController 和 DetailViewController。我重新创建了它们,现在一切正常。不知道我第一次做错了什么。感谢所有提供建议的人。 蒂姆
【讨论】:
以上是关于未调用自定义单元格 didSelectRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章
didEndEditingRow未使用自定义tableview单元调用
点击单元格时从 uitableviewcell 类调用 uipangesture
使用 UITableView 的可变高度自定义单元格调用 reloadData 时保持 UITableView 的当前位置