iPhone: didSelectRowAtIndexPath, не вызванный

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

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

Как только я касаюсь на одном из этих двух объектов, он высвечивается синий и прерывание обнаружения GDB в __forwarding__ в пределах a 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
12
задан soletan 21 February 2010 в 16:39
поделиться

3 ответа

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

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

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

3
ответ дан 2 December 2019 в 02:49
поделиться

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

Вызываете ли вы


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

Если да, то это не вызовет методы делегата tableView:willSelectRowAtIndexPath: или tableView:didSelectRowAtIndexPath: Вам придется вызывать их самостоятельно.

См. UITableView Reference.

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

3
ответ дан 2 December 2019 в 02:49
поделиться

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

[[делегат tableView] tableView: tableView didSelectRowAtIndexPath: index];

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

91
ответ дан 2 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: