IPhone: didSelectRowAtIndexPath не вызывается
Я знаю, что этот вопрос упоминается ранее, но резолюции там не применяются. У меня есть UINavigationController со встроенным UITableViewController, настроенным с использованием IB. В IB делегат UITableView и dataSource настроены на мой вывод UITableViewController. Этот класс был добавлен с использованием шаблонов XCode для классов UITableViewController. Не существует настраиваемого UITableViewCell, и представление таблицы использует стандартный стиль по умолчанию только с одним заголовком.
Ну, в симуляторе список отображается правильно, с двумя элементами, предоставленными dataSource, поэтому dataSource связан правильно. Если я удалю выходную ссылку для dataSource в IB, вместо нее будет отображаться пустая таблица.
Как только я нажимаю один из этих двух элементов, он мигает синим цветом, и GDB встречает прерывание в __forwarding__
в области UITableView::_selectRowAtIndexPath
. Это не достигает точки останова, установленной в моем непустом методе didSelectRowIndexPath. Я проверил аргументы и имя метода, чтобы исключить опечатки, приводящие к другому селектору.
Недавно мне не удалось установить, правильно ли установлен делегат, но поскольку он установлен эквивалентно dataSource, который получает два элемента из одного класса, я ожидаю, что он будет установлен правильно. Итак, что не так?
Я запускаю iPhone/iPad SDK 3.1.2... но пытался с iPhone SDK 3.1 в симуляторе.
EDIT: это код моего вывода 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
Ответы
Ответ 1
Хорошо, пытаясь сохранить делегата экземпляра UITableView, чтобы проверить успешность утечки памяти, я исследовал эту проблему и наткнулся на некоторые уроки о том, как объединить представления и контроллеры с помощью отдельных NIB, как я здесь. Этот урок, наконец, заставил меня сделать трюк:
Объединение контроллеров просмотра
Сфокусировавшись на ошибке в деталях, было два UITableViewControllers... один в основном NIB, установленный как корневой контроллер для контроллера с вкладками и второй раз в ссылочном NIB, используемом для предоставления необработанного экземпляра UITableView.
Ответ 2
В документации Apple говорится, что didSelectRowAtIndexPath:index
не будет вызываться при вызове selectRowAtIndexPath:indexPath
. Для вызова didSelectRowAtIndexPath
используйте следующее:
[[tableView delegate] tableView:tableView didSelectRowAtIndexPath:index];
Это в основном вызывает делегата.
Ответ 3
Попробуйте сделатьSelectRowAtIndexPath. Селектор, когда вы его вводили, не содержал слова "At" в имени селектора.
Вы звоните
- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition
Если это так, то это не вызовет методы делегата tableView: willSelectRowAtIndexPath: или tableView: didSelectRowAtIndexPath: вам придется называть их самостоятельно.
См. UITableView Reference.
Для чего я не вижу разницы в поведении табличного представления в версиях 3.0.x или 3.1.x.