приложение для iPhone зависает - PullRequest
0 голосов
/ 17 апреля 2011

Использование iPhone Simulator 2.2.1

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

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

* Этот фрагмент кода из рабочего приложения.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

***This snippet was added (from another working app)

    if ([[tableView cellForRowAtIndexPath:indexPath] accessoryType] == UITableViewCellAccessoryCheckmark) 
        [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryNone];    
        else 
        [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark];
    [self performSelector:@selector(deselect) withObject:nil afterDelay:0.5f];

***End of snippet

}

Я вставил несколько операторов printf для консоли, и выполнение делает это с помощью оператора if и после последней строки.

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

Сообщение об ошибке из консоли приведено ниже.

*** -[RootViewController deselect]: unrecognized selector sent to instance 0x526750
2011-04-16 16:15:30.132 lab3[37268:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[RootViewController deselect]: unrecognized selector sent to instance 0x526750'

Ответы [ 2 ]

1 голос
/ 17 апреля 2011

Ответ содержится в сообщении об ошибке: для объекта RootViewController нет селектора deselect, который в вашем коде (и фрагменте) представлен self.Метод deselect должен быть методом, определенным в другой программе, но не в вашем текущем приложении.Вырежьте и вставьте это из другой программы, и я держу пари, что это решает проблему.

Еще один совет (не связанный с проблемой, но с кодом здесь): Вы можете избежать всех этих вызовов cellForRowAtIndexPath:если вы объявляете локальную переменную перед оператором if, а затем используете эту переменную в операторе if, например,

UITAbleViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if ([cell accessoryType] == UITableViewCellAccessoryCheckmark)
    ....

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

0 голосов
/ 17 апреля 2011

Вы отправляете сообщение -deselect на self, что, по-видимому, является экземпляром RootViewController. Однако ваш класс RootViewController не имеет метода -deselect, поэтому он выдает исключение, что приводит к ошибке. Так что, либо прекратите отправку -deselect на self, либо добавьте метод -deselect в RootViewController.

Кстати, поиск NSInvalidArgumentException вызвал бы много-много похожих вопросов, поэтому вам не пришлось бы вообще ждать ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...