2012-01-18 3 views
11

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

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) 

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

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

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

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

, как я могу остановить это от исполнения я попытался около 100 различных если statments в родительском зрения и подтаблицы поймать новый indexpath и проверка Agains oldselected indexpaths затем установить

oldCheckedIndexPath = nil; 

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

ответ

23

Чистый путь, предполагая, что self является Tableview DataSource:

Проверьте количество секций в 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); 
} 
+0

О да !!! не могу поверить, я не думал об этом. отлично работал! lol Я честно ломаю голову в течение последних 5 часов, пытаясь взломать это! идеально! Большое спасибо! –

+3

+1 Для юмористического NSLog! BTW @ C.Johns не используют метод try ... catch - это невероятно плохая практика (по крайней мере, на C - Java совсем другое дело ...). – jrtc27

+0

haha ​​yea Я смеялся над этим .. @ jrtc27, да, я пошел с правильно построенным утверждением if ... он работал отлично. –

1

Я решил его с помощью другого варианта, прежде чем вызывать scrollToRowAtIndexPath: этот метод перезагружает ваше табличное представление, как [yourtableviewobject reloadData]; а затем вызвать NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([messages count] - 1) inSection:0]; [objTableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

1

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

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]; 
} 
Смежные вопросы