Ошибка «нераспознанный селектор» при доступе к делегату - PullRequest
0 голосов
/ 28 сентября 2011

Я работаю над домашним заданием № 3 для CS193P * ​​1002 * ( Осень 2010 ), графического калькулятора. Я успешно реализовал делегат, чтобы передать выражение и масштаб, и теперь пытаюсь добавить к делегату дополнительное поле, как указано в моем предыдущем вопросе .

Вот ошибка:

>2011-09-27 20:27:24.076 Graphing Calculator[8892:f803] -[GraphViewController errorForGraphView:]: unrecognized selector sent to instance 0x6c32d10

2011-09-27 20:27:24.077 Graphing Calculator[8892:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[GraphViewController errorForGraphView:]: unrecognized selector sent to instance 0x6c32d10'

*** First throw call stack:
(0x13bb062 0x154cd0a 0x13bccfd 0x13bd093 0x13220d9 0x1321cf2 0x8876 0x8d83 0x5ca23 0x1d97c13 0x1daa129 0x1cca15d 0x1da9fce 0x1d97ced 0x1d9e27d 0x1d97d13 0x1da1c58 0x1d27fb5 0x1d29ea2 0x1d2957c 0x138f9de 0x1326680 0x12f2516 0x12f1dd4 0x12f1ceb 0x12a4879 0x12a493e 0x1e38b 0x287f 0x27d5 0x1)

terminate called throwing an exceptionCurrent language:  auto; currently objective-c
(gdb) 

А вот строка, где появляется SIGABRT:

BOOL error = [self.delegate errorForGraphView:self];

Который можно найти в GraphView.m в моем Графическом калькуляторе проекта на GitHub. Я использую ARC с iOS 5 beta.

Обновление

Я должен добавить, что в классе CalculatorBrain определен метод errorForGraphView. Чего мне не хватает (мое понимание делегатов еще только зарождается), что заставляет всех искать в GraphViewController метод? Как передать информацию из CalculatorBrain в GraphView?

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

Итак, как они сказали, потому что нет метода, который якобы определен, но вот действительно очень простой способ убедиться, что метод определен :) в любом классе, который вызывает [self.delegate errorForGraphView: self]; создать протокол

@protocol Whatevertheclassis <NSObject>
-(BOOL)errorForGraphView:self];
@end

и затем объявите своего делегата как такового

@property(nonatomic, retain) id <Whatevertheclassis> delegate;

и затем синтезировать делегата

@sythesize delegate;

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

0 голосов
/ 28 сентября 2011

Сообщение означает именно то, что оно говорит: объект GraphViewController был «отправлен» и «errorForGraphView:» «message» (т. Е. «ErrorForGraphView:» был вызван с использованием указателя объекта GraphViewController.

Либо у вас естьнеправильный указатель (может быть, вам нужен объект GraphView?), или вы просто забыли реализовать errorForGraphView: (или, возможно, написали его неправильно, когда вы его реализовали).

0 голосов
/ 28 сентября 2011

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

...