NSRangeException вызывает сбой приложения на телефоне, но не на эмуляторе - PullRequest
0 голосов
/ 02 ноября 2011

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

2011-11-02 10:17:57.665 code[1327:707] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]: section (0) beyond bounds (0).'
*** First throw call stack:
(0x31fe88bf 0x31d581e5 0x31fe87b9 0x31fe87db 0x32b6df1f 0x29c9b 0x32ae26b5 0x32b3daf1 0x32afed21 0x32afea71 0x32afe78b 0x32afe4ff 0x32ab581b 0x32abafb9 0x3193aba7 0x3273be8d 0x31fbb2dd 0x31f3e4dd 0x31f3e3a5 0x3204afed 0x32ace743 0x35a1 0x301c)
terminate called throwing an exception(gdb) 

Это то, что я делаю, чтобы получить эту ошибку. enter image description here

Каждый раз, когда я вхожу в подпредставление с набором данных indexpath [0,1] во второй раз, приложение выдаст эту ошибку.

Это код, в котором произошла ошибка. subview.m

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    //Center previously selected cell to center of the screen
    [self.tableView reloadData];
    [self.tableView scrollToRowAtIndexPath:oldCheckedIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; //happens on this line
}

и это результат этой ошибки. enter image description here

Что я должен смотреть на .. Я действительно не знаю, что хорошо или плохо от этого. Что действительно расстраивает, так это то, что, если я захожу в IndexPath [0,0] с главного экрана или из любого другого из них, он работает нормально, и с этим приложением проблем не возникает ..

Я надеюсь, что кто-то может мне помочь или, по крайней мере, дать мне представление о том, в чем проблема и где.

1 Ответ

0 голосов
/ 25 мая 2012

У меня была похожая проблема в моем проекте, когда я удалял объекты из источника данных, а затем немедленно вызывал [self.tableview reloadData];

Что я сделал, чтобы решить проблему, так это позвонил:

dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^(void){
                [self.tableView reloadData];
            });

В основном это вызывает reloadData в следующем цикле выполнения. Вы можете сделать аналогичную вещь, используя performSelector:afterDelay.

Так что я предлагаю попробовать позвонить:

dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^(void){
  [self.tableView scrollToRowAtIndexPath:oldCheckedIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
}

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

...