背景:我是一个没有Objective-C / Cocoa经验的.NET人,但我正在研究Aaron Hillegass的书“Mac OS X的可可编程”,试图掌握基础知识。 (迄今为止的好书,BTW!)为了完成其中一个可选的侧面挑战,我正在编写一个基于文档的应用程序,允许用户在任意位置绘制椭圆。
我有两个类,接口如下:
@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
的事实,但我很遗憾。我应该做什么,更重要的是,为什么?
更新:我没有在OvalDrawDocument.m中声明OvalView.h。这样做修复了编译警告。但是,保存和加载似乎仍然无效,我无法弄清楚原因。
根据要求,我已在网上发布完整的源代码供我细读:Browse或Download (59KB zip)。
答案 0 :(得分:5)
警告:在OvalDrawDocumentation实现文件中导入OvalView的标头。
消息在运行时不起作用:确保您实际连接了IB中的插座。
另外,正如Martin Pilkington在对你的问题的评论中所说,你可能应该用retain
声明该属性,而不是assign
。
答案 1 :(得分:1)
它与IBOutlet keywrod无关,它只是Interface Builder的“辅助”关键字,在编译时被定义为“无”。你确实导入了相关的头文件并在myOvalView上做了一个alloc / init吗?
答案 2 :(得分:0)
我认为你必须展示更多的代码,因为你似乎有正确的东西,所以你必须在其他地方遗漏某些东西。此外,如果您要将椭圆声明为属性,那么在OvalDrawDocument中使用属性语法是有意义的:
// in OvalDrawDocument.m
myOvalView.ovals = loadedOvals; // setter
NSMutableArray *ovalsToSave = myOvalView.ovals; // getter