2012-01-31 5 views
16

У меня есть UITableViewController с Segue, где я пытаюсь получить выбранный ряд:indexPathForSelectedRow возвращение ноль

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if([[segue identifier] isEqualToString:@"EditFilterElementSegue"]){ 
     // Get the element that was clicked and pass it to the view controller for display 
     NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; 
     Element *element = [fetchedResultsController objectAtIndexPath:selectedIndexPath]; 
     FilterElementTableViewController *vc = segue.destinationViewController; 
     vc.filter = filter; 
     vc.element = element; 
    } 
} 

Проблема в том, indexPathForSelectedRow возвращается ноль. Документы говорят, что nil возвращается «если указательный путь недействителен». Если я добавлю:

 [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES scrollPosition:0]; 
     selectedIndexPath = [self.tableView indexPathForSelectedRow]; 

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

Этот код работал нормально, пока не преобразован в NSFetchedResultsController (который в противном случае работает). Я также использую indexPathForSelectedRow в нескольких других контроллерах табличных представлений, где он отлично работает (один из которых также использует NSFetchedResultsController).

Я также попытался взломать didSelectRowAtIndexPath, но то же самое происходит там. (Ожидается, так как это называется после prepareForSegue.)

ответ

1

Хорошо, нижняя строка сцены в раскадровке была испорчена.

Чтобы понять это, я удалил segue и создал совершенно новый пустой класс UITableViewController и добавил только достаточно кода, чтобы я мог щелкнуть по строке и посмотреть на indexPathForSelectedRow. Это было еще ноль.

Затем я создал новый UITableViewController в раскадровке и заменил существующий. Теперь работает indexPathForSelectedRow.

Я скопировал весь код класса и прототипы ячеек, и он все еще работал!

Из любопытства я взглянул на источник раскадровки для двух сцен и заметил, что сцена, которая не работала, была намного длиннее новой. Глядя на схему раскадровки, было очевидно, почему, и удивительно, что это сработало. И теперь я помню, что у меня проблемы с резкой &, вставляющей прототип ячейки. Думаю, я должен чаще смотреть на схему. Смотрите снимок экрана ниже (визуальные сцены выглядят одинаково):

Storyboard screen shot

22

Возможной причиной является то, что вы написали что-то в одном из UITableViewDelegate методов -

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
} 

Это обычная практика deselect the row, который только что был выбран.

+8

Для меня я отменил выбор. «Doh! – Baub

9

Будьте уверены, вы не вызывая deselectRowAtIndexPath метода до получения индекса пути выбранной строки.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; //add this line after setting indexPath 
} 
+0

reloadData также может привести к отмене выбора строки – foOg

0

Я также имел эту проблему, когда я заменил класс UITableViewController с классом UIViewController в коде, а не обновлять раскадровку, т.е. я не заменить заполнитель UITableViewController в раскадровке, с раскадровкой UIViewController.

2

ОК В моем случае я звонил из UIButton в раскадровке на шоу segue.

и удаление следующую строку:

NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

с ниже 2 линии работали для меня:

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView]; NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];

надежда моим делом "призывающей SEGUE из UIButton на CELL" работает для других также.

+0

ничего себе, это прекрасно, я делал что-то подобное. Где мне пришлось перезагрузить определенную ячейку, но с тех пор, как раздел изменился при прокрутке, я больше не мог обновляться. вот что я использовал вместе с вашим ответом NSArray * indexPathArray = [NSArray arrayWithObject: [NSIndexPath indexPathForRow: indexPathSectionRow.row inSection: indexPathSectionRow.section]]; [self.nationalTableView reloadRowsAtIndexPaths: indexPathArray withRowAnimation: UITableViewRowAnimationFade]; –

12

Что-то, что может помочь другим людям - если вы назовете reloadData() на вашем столе, это приведет к нулю indexPathForSelectedRow.

+1

Эта удивительно простая находка только что сэкономила мне пару часов;) –

+0

спасибо, что она очень помогает – SamuelChan

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