2013-08-23 1 views
4

Я создаю пользовательский элемент селектора меню UITableView. Каждый раз, когда я выбирал определенную строку, я сохраняю индексный путь этой строки, поэтому в следующий раз, когда пользователь будет выбирать другую строку, люди могут узнать свою предыдущую выбранную строку. Поэтому я добавил это в cellForRowAtIndexpathЯ добавил selectRowAtIndexPath в cellForRowAtIndexpath, чтобы отметить предыдущую выбранную строку, но если прокрутить tablview, она разбивается

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 

    cell.textLabel.text = self.left[indexPath.row][@"name"]; 
    [tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue] inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone]; 
    cell.selectionStyle = UITableViewCellSelectionStyleGray; 
    cell.textLabel.highlightedTextColor = [UIColor grayColor]; 
    return cell; 
} 

и когда пользователь выбирает другую строку, сохранить эту строку: [[[NSUserDefaults standardUserDefaults] objectForKey: kPreviousSelectedRow], поэтому в следующий раз он может видеть свою предыдущую выбранную строку.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:indexPath.row] forKey:kPreviousSelectedRow]; 
} 

Журнал аварии: индекс [[[NSUserDefaults standardUserDefaults] objectForKey: kPreviousSelectedRow] integerValue] и отсчет numberOfRows. Как вы можете видеть, это не должно выходить за рамки. Я не знаю, откуда [0 ... 6].

2013-08-23 21:01:26.107 [17605:c07] index:10, count:14 
2013-08-23 21:01:26.173[17605:c07] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 7 beyond bounds [0 .. 6]' 

Редакция: И если я прокручивать TableView медленно, он не рухнет, если я прокручиваю это быстро, он выходит из строя. что?

+1

сообщение об авариях здесь. – Balu

+3

cellForRowAtIndexPath вызывается каждый раз, когда пользователь прокручивает новые ячейки на экран. Это действительно то место, где вы хотите выбрать свою ячейку? –

+0

У меня нет другого выхода. Это подкласс UIView. –

ответ

2

Вы получаете сбой, потому что в это самое время у вас нет ячейки с заданным индексом, потому что вы просто подготавливая его внутри Ваш - (UITableViewCell*)tableView:cellForRowAtIndexPath:

Чтобы получить поведение вы ожидаете движение selectRowAtIndexPath: из - (UITableViewCell*)tableView:cellForRowAtIndexPath: и поместить его в другой метод, при котором вы обновляете ваши UITableView: -(void)viewDidLoad или где вы звоните -(void)reloadTable, например

+0

Но это подкласс UIView, нет viewdidload. –

+0

Найдите другое место, где вы уже загрузили/обновили свой стол. – SVGreg

+0

layoutsubviews? –

0
[tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue] inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone]; 

Не должно быть внутри cellForRowAtIndexpath.

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

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

Нет, я не выбираюRow в cellForRow, я использую selectRowAtIndexPath для отметки предыдущей выбранной строки, поэтому пользователь может узнать свой предыдущий выбранный вариант. Затем, если пользователь хочет выбрать другую строку, я реализую ее в файле didSelectRowAtIndexPath. Каков лучший способ отметить предыдущую выбранную строку пользователя. –

0

Вы можете создать массив с объемом, равным количеству строк. Вероятно, заселяем его значениями NO BOOL (фактически [NSnumber numberWithBool:], поскольку они должны быть объектами).

Тогда в

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

изменить значение объекта в позиции indexPath.row,

И

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

проверки, если значение BOOL из вашего массива устанавливается на YES затем выберите ячейку. (cell.selected = YES)

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

0

О, я просто заменю selectRowAtindex на layoutsubview, и он не будет разбиваться, теперь. спасибо подсказку SVGreg.

1

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

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue] inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone]; 
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:indexPath.row]  forKey:kPreviousSelectedRow]; 
} 
+0

Но он не помечен предыдущей выбранной строкой. –

+0

Это странно, у меня такой же код работает. Вы хотите, чтобы обе строки были выбраны? У вас есть многосегментный набор? Вы не выбираете строку в любом другом месте? – Callistino

+0

Кроме того, убедитесь, что NSUserDefaults установлены перед вызовом selectRowAtIndexPath. Вы можете обернуть его в оператор if. – Callistino

0

SVGreg был прав. Вы должны работать с ячейкой внутри другого метода. Но viewDidLoad не самый лучший вариант. Вы можете попробовать этот полезный метод делегирования

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 

    [tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue] inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone]; 
    cell.selectionStyle = UITableViewCellSelectionStyleGray; 
} 
Смежные вопросы