Основной вопрос Obj-C: вызов методов для объекта - PullRequest
1 голос
/ 15 мая 2009

Предыстория: я парень .NET, у которого нет опыта работы с Objective-C / Cocoa, но я работаю над книгой Аарона Хиллегаса "Программирование какао для Mac OS X", пытаясь понять основы. (Отличная книга, кстати!) Для решения одной из дополнительных проблем я пишу приложение на основе документов, которое позволяет пользователям рисовать овалы в произвольных местах.

У меня есть два класса, интерфейсы следующие:

@interface OvalDrawDocument : NSDocument
{
    IBOutlet OvalView* myOvalView;
}
@end

@interface OvalView : NSView {
    NSMutableArray *ovals;
}
@property (readwrite, assign) NSMutableArray *ovals;
@end

В реализации OvalDrawDocument я пытаюсь использовать автоматически созданный метод доступа к свойству для ovals, например, так:

// in OvalView.m
@synthesize ovals;

// in OvalDrawDocument.m
[myOvalView setOvals:loadedOvals];                // setter?
NSMutableArray *ovalsToSave = [myOvalView ovals]; // getter?

Однако компилятор предупреждает меня, что методы не найдены, и они также не работают во время выполнения. Они появляются в Code Sense, но я думаю, что это ничего не значит (все еще привыкаю к ​​различиям между XCode / VS здесь) Я предполагаю, что есть некоторая концепция Obj-C, которую я не совсем уловил, возможно, связанная тот факт, что myOvalView тоже IBOutlet, но я довольно растерян. Что мне делать, и, что более важно, почему?


Обновление : я не объявлял OvalView.h в OvalDrawDocument.m. Это исправило предупреждения компиляции. Однако сохранение и загрузка по-прежнему не работают, и я не могу понять, почему.

По запросу я выложил полный исходный код в Интернете для прочтения: Просмотр или Загрузка (59 КБ zip) .

Ответы [ 3 ]

5 голосов
/ 15 мая 2009

Предупреждение: импортировать заголовок OvalView в файл реализации OvalDrawDocumentation.

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

Также, как сказал Мартин Пилкингтон в своем комментарии к вашему вопросу, вам, вероятно, следует объявить это свойство с retain, а не assign.

1 голос
/ 15 мая 2009

Он не имеет ничего общего с ключевым словом IBOutlet, которое является просто ключевым словом "помощник" для Interface Builder и определяется как "ничто" во время компиляции. Вы импортировали соответствующие файлы заголовков и сделали alloc / init для myOvalView?

0 голосов
/ 15 мая 2009

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

// in OvalDrawDocument.m
myOvalView.ovals = loadedOvals;                // setter
NSMutableArray *ovalsToSave = myOvalView.ovals; // getter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...