Нестабильность сегментированного UITable - PullRequest
1 голос
/ 11 июня 2011

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

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

Одна из самых больших ошибок - когда я нажимаю одну из таблиц Acells of A, и во время ее загрузки я нажимаю индекс сегмента = 1, который загружает B. Это вызывает отправку нераспознанного селектора. значение параметра o Таблица для отправки в таблицу B.

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier0;
    if (choice == 0) {
        CellIdentifier0 = @"ACell";
    } else if (choice == 1) {
        CellIdentifier0 = @"BCell";
    }

    UITableViewCell *cell;

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier0];
    if (cell == nil) {  
        if (choice == 0) {
            [[NSBundle mainBundle] loadNibNamed:@"ACell" owner:self options:nil];
        cell = ACell;
            self.ACell = nil;
        } else if (choice == 1) {
            [[NSBundle mainBundle] loadNibNamed:@"BCell" owner:self options:nil];
            cell = BCell;
            self.BCell = nil;   
        }
    }

    if (choice == 0)  {
        [(ACell *)cell setA:(A*)[contentArray objectAtIndex:indexPath.row]];
    } else if (choice == 1) {
        [(BCell *)cell setB:(B*)[contentArray objectAtIndex:indexPath.row]];
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if ( choice == 0) {
        A = [contentArray objectAtIndex:indexPath.row];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"showA" object:A];
    } else if (choice ==1) {
        B = [contentArray objectAtIndex:indexPath.row];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"showB" object:B];
    }
}

Ответы [ 2 ]

0 голосов
/ 11 июня 2011

Предполагая, что ACell имеет сохраненное значение при загрузке файла пера, выполнение self.ACell = nil; сбросит старое значение и установит ACell в nil. Теперь старшее значение - это то, на которое указывает cell. Технически, он будет указывать на мусор, как если бы он был освобожден, потому что ACell - единственная переменная, сохраняющая объект. Вы можете исправить это, заменив,

cell = ACell;

с

cell = [[ACell retain] autorelease];

В качестве идентификатора, в методе didSelectRowAtIndexPath: вы делаете } else if (choice = 1) {. Убедитесь, что вы используете == вместо =, который всегда будет иметь значение true вместе с изменением значения choice, хотя в этом случае это маловероятно.

0 голосов
/ 11 июня 2011

проверка выбора орфографии

 if (choicee==0) {
[[NSBundle mainBundle] loadNibNamed:@"ACell" owner:self options:nil];
     cell = ACell;
    self.ACell = nil;}
else if (choice==1) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...