ошибка с scrollToRowAtIndexPath - PullRequest
       5

ошибка с scrollToRowAtIndexPath

11 голосов
/ 19 января 2012

Я получаю сообщение об ошибке при использовании моего приложения, в котором используются табличные представления, ошибка выглядит следующим образом.

2012-01-19 10:19:51.442 bcode[1176:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]: row (3) beyond bounds (3) for section (0).'
*** First throw call stack:
(0x16c3052 0x1920d0a 0x166ba78 0x166b9e9 0x68a136 0x3bfdf 0x6c2fbf 0x6c32d4 0x6c35d7 0x6d2666 0x87890e 0x878c17 0x878c86 0x62c499 0x62c584 0x2718e00 0x13614f0 0x15fa833 0x15f9db4 0x15f9ccb 0x1d05879 0x1d0593e 0x5fba9b 0x2838 0x2795 0x1)
terminate called throwing an exception(gdb) 

NSRangeException, -[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]
строка (3) за пределами (3) для секции (0).

Происходит следующее: когда пользователь просматривает мое навигационное представление, он может выбрать ячейку в табличном представлении каждого представления, которое позже будет использовано для построения строки поиска.

Однако я разрешаю им вернуться и изменить свой выбор, если они допустили ошибку. Эта ошибка возникает, когда пользователь изменяет значение родительского представления и затем входит в подпредставление, только если предыдущий выбор был за пределами числа записей в текущем табличном представлении ..

обычно это не было бы большой проблемой, однако внутри viewDidAppear я вызываю метод, который прокручивает к ранее выбранной ячейке ... что, очевидно, является причиной взлома приложения и выдачи мне ошибки.

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    //Scroll to previously selected value
    [self.tableView scrollToRowAtIndexPath:oldCheckedIndexPath  atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}

как я могу остановить выполнение этого? Я попробовал примерно 100 различных тестов, если в родительском представлении и подпредставлении перехвачен новый путь индекса и проверены старые выбранные пути индекса, а затем установлена ​​

oldCheckedIndexPath = nil;

однако каким-то образом все равно всегда удается все испортить.

Ответы [ 3 ]

26 голосов
/ 19 января 2012

Чистым способом, при условии self, является источник данных tableView:

Проверьте количество секций в табличном представлении:

if ( [self numberOfSectionsInTableView:self.tableView]
                                     > oldCheckedIndexPath.section 

и проверьте количество строк в этом разделе:

  && [self tableView:self.tableView numberOfRowsInSection:
          oldCheckedIndexPath.section] > oldCheckedIndexPath.row )
   {
      [self.tableView scrollToRowAtIndexPath: // etc etc etc

Или быстрый взлом:

@try {
    [self.tableView scrollToRowAtIndexPath: // etc etc etc 
}
@catch ( NSException *e )
{
    NSLog(@"bummer: %@",e);
}
4 голосов
/ 29 июня 2017

Вдохновленный принятым ответом:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
if ([self numberOfSectionsInTableView:self.tableView] > indexPath.section && [self tableView:self.tableView numberOfRowsInSection:indexPath.section] > indexPath.row) {
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
1 голос
/ 07 ноября 2013

Я решил это с помощью другой опции перед вызовом scrollToRowAtIndexPath: этот метод перезагрузит ваш просмотр таблицы с помощью [yourtableviewobject reloadData]; и затем вызовет:

NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([messages count] - 1) inSection:0];
[objTableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
...