我知道之前提到的这个问题,但那里的决议并不适用。我有一个UINavigationController,它使用IB设置嵌入式UITableViewController。在IB中,UITableView的委托和dataSource都设置为我的UITableViewController的派生。使用XCode的UITableViewController类模板添加了这个类。没有自定义UITableViewCell,表视图仅使用带有单个标题的默认普通样式。
好吧,在模拟器中,列表正确呈现,dataSource提供了两个元素,因此dataSource正确链接。如果我在IB中删除了dataSource的出口链接,则会呈现一个空表。
只要点击这两个项目中的一个,它就会闪烁蓝色,并且GDB在__forwarding__
范围内UITableView::_selectRowAtIndexPath
遇到中断。它没有达到我的非空方法didSelectRowIndexPath中设置的断点。我检查了参数和方法的名称,以排除导致不同选择器的拼写错误。
我最近没有成功设置委托是否正确,但是因为它被设置为等同于从同一个类中获取两个元素的dataSource,我希望它能够正确设置。那么,怎么了?
我正在运行iPhone / iPad SDK 3.1.2 ...但是也在模拟器中尝试使用iPhone SDK 3.1。
编辑:这是我的UITableViewController派生的代码:
#import "LocalBrowserListController.h"
#import "InstrumentDescriptor.h"
@implementation LocalBrowserListController
- (void)viewDidLoad {
[super viewDidLoad];
[self listLocalInstruments];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
[super viewDidUnload];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [entries count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
if ( ( [entries count] > 0 ) && ( [indexPath length] > 0 ) )
cell.textLabel.text = [[[entries objectAtIndex:[indexPath indexAtPosition:[indexPath length] - 1]] label] retain];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ( ( [entries count] > 0 ) && ( [indexPath length] > 0 ) )
{
...
}
}
- (void)dealloc {
[super dealloc];
}
- (void) listLocalInstruments {
NSMutableArray *result = [NSMutableArray arrayWithCapacity:10];
[result addObject:[InstrumentDescriptor descriptorOn:[[NSBundle mainBundle] pathForResource:@"example" ofType:@"idl"] withLabel:@"Default 1"]];
[result addObject:[InstrumentDescriptor descriptorOn:[[NSBundle mainBundle] pathForResource:@"example" ofType:@"xml"] withLabel:@"Default 2"]];
[entries release];
entries = [[NSArray alloc] initWithArray:result];
}
@end
答案 0 :(得分:91)
Apple的文档说调用didSelectRowAtIndexPath:index
时不会调用selectRowAtIndexPath:indexPath
。要致电didSelectRowAtIndexPath
,请使用以下内容:
[[tableView delegate] tableView:tableView didSelectRowAtIndexPath:index];
这基本上会调用委托。
答案 1 :(得分:3)
尝试didSelectRowAtIndexPath。键入的选择器在选择器名称中缺少单词“At”。
你在打电话吗
- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition
如果你是,那么就不会调用委托方法tableView:willSelectRowAtIndexPath:或tableView:didSelectRowAtIndexPath:你必须自己调用它们。
对于它的价值,我没有看到3.0.x或3.1.x版本中的表视图行为有任何不同。
答案 2 :(得分:3)
好吧,在尝试保留UITableView实例的委托只是为了检查内存泄漏是否成功之后,我调查了这个问题并偶然发现了一些关于如何使用分离的NIB组合视图和控制器的教程,就像我在这里一样。本教程最终让我做到了诀窍:
详细关注错误有两个UITableViewControllers ...一个在主NIB中设置为选项卡式导航控制器的根控制器,另一个在引用的NIB中用于提供原始UITableView实例。