Почему появляется эта ошибка?
Поскольку вы отправляете isEqualToString:
объекту Шутки, а ваши объекты Шутки не отвечают на isEqualToString:
.
Вы, вероятно, не намеренно отправляете это сообщение своим объектам Шутки; вместо этого вы передаете или возвращаете объекты Joke чему-то, что ожидает объекты NSString.
Вы говорите, что jokes
- это «множество полных шуток». Тем не менее, в вашем коде вы делаете это:
NSString *jokeText = [jokes objectAtIndex:indexPath.row];
UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1];
jokeTextLabel.text = jokeText;
Исходя из исключения, я предполагаю, что под «массивом шуток» вы подразумевали «массив объектов шутки».
Помещение объекта Joke в переменную NSString *
не превращает объект Joke в строку NSString. Все, что вы делаете, это сообщаете компилятору, что переменная содержит строку NSString, а затем вставляете в нее шутку. Я называю это «ложью компилятору».
Первый шаг в исправлении этого - удалить ложь и восстановить правду на своем месте:
Joke *joke = [jokes objectAtIndex:indexPath.row];
Если вы скомпилируете сразу после этого, вы заметите, что компилятор начал предупреждать вас через пару строк:
jokeTextLabel.text = jokeText;
предупреждение: передача аргумента 1 из 'setText:' из отдельного типа Objective-C
Это верно, конечно. Шутки все еще не NSStrings. Теперь, когда вы честны с типом переменной, компилятор может поймать это за вас.
Фактическое исправление возникает, когда вы запрашиваете у объекта Joke его текст (я предполагаю, что у него есть свойство для этого, и что значение этого свойства является строкой NSString) и передаете , что jokeTextLabel.text
сеттер.
Как я могу определить, что такое "0x52e2f0", чтобы было проще найти проблему в следующий раз?
В окне точек останова Xcode установите точку останова на objc_exception_throw
. Затем запустите вашу программу. Когда происходит исключение, отладчик остановит вашу программу, и откроется окно отладчика. Затем введите po 0x52e2f0
в консоли отладчика. (po
означает «объект печати».)
Это работает для приложений Mac; Я предполагаю, что это также будет работать для приложений iPhone.