2010-02-21 3 views
11

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

Ну, в симуляторе список отображается правильно, с двумя элементами, предоставленными 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 
+0

Возможный дубликат [Выбрать программный код таблицы просмотра] (http://stackoverflow.com/questions/2035061/select-tableview-row-programmatically) – jk2K

ответ

3

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

Combining View Controllers

фокусировки на ошибках в деталях было две UITableViewControllers ... один в главном СИБА установить в качестве корневого контроллера для вкладок контроллера навигации и второй раза в ссылочном СИБЕ вместо этого используется для создания необработанного экземпляра UITableView.

+0

ссылка не работает :( –

3

Try didSelectRowAtIndexPath. Селектору, когда вы ввели его, было не указано слово «At» в имени селектора.

вы звоните


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

Если вы, то это не будет вызывать методы делегата Tableview: willSelectRowAtIndexPath: или Tableview: didSelectRowAtIndexPath: Вы должны назвать их самостоятельно.

См. UITableView Reference.

Для чего я не вижу разницы в поведении табличного представления в версиях 3.0.x или 3.1.x.

+0

Спасибо за ваш ответ. И извините за опечатку, конечно, метод включает «At» ... и я не вызываю selectRowAtIndexPath() программно ... это все реагирует на нажатие пользователя. Я прочитал большинство частей документов UITableView относительно их создания и управления выборами. Добавленный код моего производного класса контроллера выше. – soletan

+0

Интегрированный код, например 'if ([UITableView *) self.view delegate]! = Self) {...}' в 'viewDidLoad' и перед возвратом из' tableView: cellForRowAtIndexPath: 'для проверки делегата для соответствия' self' , Кроме того, в iPad симулятор, нажимая существующие элементы, не прерывает отладчик, но выбирает элементы без ввода didSelectRowAtIndexPath ... выглядит так, как XCode ведет себя как Word 97 при редактировании 100-й страницы в документе. – soletan

89

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

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

В основном это вызывающий делегат.

+13

Это довольно неблагодарно! Одна из замечательных вещей о StackOverflow - это то, что помогает сообществу, а не только человеку. Лично я нашел этот ответ именно тем, что мне нужно. Спасибо RPM. –

+0

@soletan I думаю, что мой ответ должен быть выбран в качестве принятого ответа. Просто скажите ';-) – RPM

+1

Этот ответ объяснил причину ясно и решил мою проблему. Благодаря! – JonSlowCN

Смежные вопросы