iPhone: didSelectRowAtIndexPath не вызывается - PullRequest
12 голосов
/ 21 февраля 2010

Я знаю, что эта проблема упоминалась ранее, но решения там не применяются. У меня UINavigationController со встроенным UITableViewController, настроенным с использованием IB. В IB делегат UITableView и dataSource оба установлены для моего происхождения UITableViewController. Этот класс был добавлен с использованием шаблонов XCode для классов UITableViewController. Пользовательского UITableViewCell не существует, и табличное представление использует простой стиль по умолчанию только с одним заголовком.

Что ж, в симуляторе список отображается правильно, с двумя элементами, предоставленными dataSource, поэтому dataSource связан правильно. Если я удалю ссылку выхода для источника данных в IB, вместо этого будет отображена пустая таблица.

Как только я нажимаю на один из этих двух элементов, он мигает синим, и GDB встречает прерывание в __forwarding__ в пределах UITableView::_selectRowAtIndexPath. Это не достигает точки останова, установленной в моем непустом методе didSelectRowIndexPath. Я проверил аргументы и имя метода, чтобы исключить опечатки, приводящие к другому селектору.

Недавно мне не удалось установить, правильно ли установлен делегат, но так как он установлен эквивалентно источнику данных, который получает два элемента из одного класса, я ожидаю, что он будет установлен правильно. Итак, что не так?

Я использую 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

Ответы [ 3 ]

91 голосов
/ 28 апреля 2010

В документации Apple говорится, что didSelectRowAtIndexPath:index не будет вызываться при вызове selectRowAtIndexPath:indexPath. Для вызова didSelectRowAtIndexPath используйте следующее:

[[tableView delegate] tableView:tableView didSelectRowAtIndexPath:index];

Это в основном вызывает делегата.

3 голосов
/ 04 марта 2010

Что ж, после попытки сохранить делегат экземпляра UITableView просто для проверки утечки памяти с успехом, я исследовал эту проблему и наткнулся на некоторые учебные пособия о том, как объединять представления и контроллеры, используя отдельные NIB, как я делаю здесь. Этот урок, наконец, заставил меня сделать трюк:

Объединение контроллеров представления

Сосредоточив внимание на ошибке, было два UITableViewControllers ... один в основном NIB, установленный в качестве корневого контроллера для контроллера навигации с вкладками, и второй раз в ссылочном NIB, который вместо этого использовался для необработанного экземпляра UITableView.

3 голосов
/ 21 февраля 2010

Попробуйте didSelectRowAtIndexPath. В селекторе, когда вы его вводили, в имени селектора отсутствовало слово «At».

Вы звоните


- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition

Если это так, то это не вызовет методы делегата

См. UITableView Справочник .

Несмотря на это, я не видел никакой разницы в поведении табличного представления в выпусках 3.0.x или 3.1.x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...