Objective c Wikibooks WikiDraw Obj-C应用程序帮助

Objective c Wikibooks WikiDraw Obj-C应用程序帮助,objective-c,cocoa,macos,Objective C,Cocoa,Macos,我决定开始学习一些Obj-C。我认为应用程序将是一个很好的开始(在一些非常基本的“Hello World”程序之后)。我已经看完了这些章节,现在我已经到了“WikiDraws视图类”的末尾。所以现在我应该可以编译和运行了。当然不行了。起初我犯了很多错误,但我已经修复了大部分错误,只剩下6个。这是其中之一: 那么在 NSRect nb=[self newBoundsFromBounds:… 我收到一条错误消息,“Invailid初始值设定项”和“WKDShape可能不会响应”-newBound

我决定开始学习一些Obj-C。我认为应用程序将是一个很好的开始(在一些非常基本的“Hello World”程序之后)。我已经看完了这些章节,现在我已经到了“WikiDraws视图类”的末尾。所以现在我应该可以编译和运行了。当然不行了。起初我犯了很多错误,但我已经修复了大部分错误,只剩下6个。这是其中之一:

那么在 NSRect nb=[self newBoundsFromBounds:…
我收到一条错误消息,“Invailid初始值设定项”和“WKDShape可能不会响应”-newBoundsFromBounds:forHandle:withDelta:”-。我该怎么办?我对编码不熟悉,但渴望学习


/卡尔·菲利普(Carl Philip)

假设您已经按照源代码中编写的顺序粘贴了代码,并且在早些时候没有声明newBoundsFromBounds:forHandle:withDelta:(与定义不同),我认为问题在于nb=[self-newBoundsFromBounds:…编译器尚不知道返回类型。NSRect是C样式的结构,而不是Objective-C类,因此编译器确实需要知道

作为一种解决方案,可以将newBoundsFromBounds:…的定义放在mouseDragged:之前,如果希望它向所有人公开,则将其添加到头文件中的@interface中,或者将其作为一个类别方法在实现文件内部声明。若要执行最后一个定义,请将以下内容添加到.m的顶部,假设您的类名为WikiDrawsView:

@interface WikiDrawsView (private)
- (NSRect)newBoundsFromBounds:(NSRect) old 
                    forHandle:(int) whichOne
                    withDelta:(NSPoint) p;
@end

“私有”只是一个你可以选择的名字,它没有特殊的含义。通常使用“私有”来表示你使用的是一种类似的方式,你可以使用C++中的私有类成员函数或类似的语言。


描述类别的快速方法是,它们在运行时将其他方法修补到现有类上,并使用@interface[classname]([category name])语法,没有成员变量部分。我相信你的教程会找到它们,苹果的文档是。这是类别的常用用法,但不是主要用法。

为了解决“WKDShape可能没有响应”警告,请确保在
-mouseDragged:
之前声明
-newBoundsFromBounds:forHandle:withDelta:
。您可以将其添加到“WKDShape.h”或“WKDShape.m”中的公共界面中

请复制并粘贴你所得到的确切错误信息,并考虑发布整个源文件或项目。特别是当你开始时,很难说出你的代码的哪部分造成了错误,这可能不是你所想的。(例如,您提到的问题已经模棱两可,
NSRect nb=…
但该代码在粘贴的代码段中出现了两次。)谢谢,效果很好!我还错过了声明另一个方法,但当我这样做时,一切都正常了。
@interface WikiDrawsView (private)
- (NSRect)newBoundsFromBounds:(NSRect) old 
                    forHandle:(int) whichOne
                    withDelta:(NSPoint) p;
@end