Сбой приложения из-за UITableViewScrollPositionMiddle при тестировании на телефоне, но не на эмуляторе

#iphone #ios #uitableview

#iPhone #iOS #uitableview

Вопрос:

У меня есть uitableview с массивом значений словаря, создающим довольно большой список. Из которого пользователь может выбирать .. как только пользователь выбирает ячейку, я извлекаю представление из навигационного стека и передаю все значения обратно в основное представление.. Затем я разрешаю пользователю вернуться к этому представлению, если они допустили ошибку и хотели бы изменить свой ввод.

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

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

вот где, я думаю, возникает ошибка

 - (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    //Center previously selected cell to center of the screen
    [self.tableView scrollToRowAtIndexPath:oldCheckedData  atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; //<--- this method
}
  

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

 2011-10-19 15:00:05.790 icode[1564:707] -[__NSArrayM section]: unrecognized selector sent to instance 0x181cd0
2011-10-19 15:00:05.797 icode[1564:707] CoreAnimation: ignoring exception: -[__NSArrayM section]: unrecognized selector sent to instance 0x181cd0
  

(эффект прокрутки отсутствует)
затем пользователь выбирает другую ячейку, и это приложение выходит из строя, и это отображается в журнале

 2011-10-19 15:01:08.272 icode[1564:707] -[__NSArrayM row]: unrecognized selector sent to instance 0x181cd0
2011-10-19 15:01:08.275 icode[1564:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM row]: unrecognized selector sent to instance 0x181cd0'
*** First throw call stack:
(0x35e9e8b3 0x366e61e5 0x35ea1acb 0x35ea0939 0x35dfb680 0x334a76cf 0x3353c713 0x30e1d 0x3352cd69 0x335a60ab 0x35cc32ab 0x35e72a57 0x35e726bd 0x35e71293 0x35df44e5 0x35df43ad 0x30fa4fed 0x334a7dc7 0x24f7 0x24a0)
terminate called throwing an exception(gdb) 
  

любая помощь была бы высоко оценена.

Источники данных Tableview

 #pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return [arraysByLetter count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSString *currentLetter = [sectionLetters objectAtIndex:section];
    return [[arraysByLetter objectForKey:currentLetter] count];
}

/*
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{    
    //override state-based properties set earlier by the table view, such as selection and background colorset up shit here
}
 */

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    } 

    //Customize cell here
    cell.selectionStyle = UITableViewCellSelectionStyleNone; // no blue selection

    //Replaces previously selected cells accessory view (tick)
    if (indexPath == oldCheckedData) 
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } 
    else 
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
    } 

    //Display cells with data
    NSArray *keys = [self.arraysByLetter objectForKey:[self.sectionLetters objectAtIndex:indexPath.section]];
    NSString *key = [keys objectAtIndex:indexPath.row];

    cell.textLabel.text = key;
    return cell;
}

//Section headers
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{
    return [sectionLetters objectAtIndex:section];
}

//Section header titles
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    return sectionLetters;

}
  

Комментарии:

1. Опубликуйте свой код, который показывает методы TableViewDataSource. Из ваших журналов вы передаете методы row и section объекту Array, который приводит к сбою вашего приложения. Также при компиляции исходного кода смотрите на предупреждения компилятора.

2. при сборке нет предупреждений.. Я обновил код с помощью моих методов TableViewDataSource

Ответ №1:

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

Комментарии:

1. ну, в эмуляторе oldCheckedData работает нормально. оно прокручивается до правильного верха и устанавливает галочку в правильном indexpath.. так что я не уверен, что это все… У меня также есть NSloged oldCheckedData, и, похоже, все в порядке.

2. Возможно, что oldCheckedData было освобождено, но все еще находится в ячейке памяти, на которую указывает ссылка в родительском vc. В симуляторе у вас намного больше памяти для работы, поэтому, возможно, она еще не использовалась повторно. Память телефона — это другая история.

3. Попробуйте установить точку останова в [self.tableView scrollToRowAtIndexPath:oldCheckedData atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; и посмотрите, что oldCheckedData происходит при перезагрузке вложенного представления.