帮助 Wikibooks WikiDraw Obj-C 应用程序
Posted
技术标签:
【中文标题】帮助 Wikibooks WikiDraw Obj-C 应用程序【英文标题】:Help with Wikibooks WikiDraw Obj-C application 【发布时间】:2011-06-30 11:12:42 【问题描述】:我决定开始学习一些 Obj-C。而且我认为Wikibooks wikidraw 应用程序将是一个很好的起点(在一些非常基本的“Hello World”程序之后)。我已经阅读了这些章节,现在我在“WikiDraws 视图类”的末尾。所以现在我应该能够编译和运行。当然是行不通的。一开始我遇到了很多错误,但我已经修复了大部分,只剩下 6 个。这是其中之一:
- (void) mouseDragged:(NSPoint) pt
NSPoint np;
np.x = pt.x - _anchor.x;
np.y = pt.y - _anchor.y;
如果(_dragState == 0)
// 拖动对象
[self offsetLocationByX:np.x byY:np.y];
否则如果(_dragState >= 1 && _dragState
[自我设置边界:nb];
- (NSRect) newBoundsFromBounds:(NSRect) old forHandle:(int) whichOne withDelta:(NSPoint) p
// figure out the desired bounds from the old one, the handle being dragged and the new point.
NSRect nb = old;
switch( whichOne )
..........
所以在 NSRect nb = [self newBoundsFromBounds:... 我收到一条错误消息,“Invailid initializer”和“WKDShape 可能无法响应 '-newBoundsFromBounds:forHandle:withDelta:”- 。我该怎么办?我是编码新手,但渴望学习。
/卡尔-菲利普
【问题讨论】:
请复制并粘贴您收到的确切错误消息,并考虑发布整个源文件或项目。尤其是刚开始时,很难判断代码的哪一部分导致了错误,而且可能不是您想的那样。 (例如,您的问题已经模棱两可——您提到了NSRect nb = ...
,但该代码在您粘贴的 sn-p 中出现了两次。)
【参考方案1】:
假设您已按照源代码中编写的顺序粘贴该代码,并且 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
“私人”只是一个你可以选择的名字,它没有特殊含义。 'private' 之类的东西通常用于表示您使用类别的方式与您在 C++ 或类似语言中使用私有类成员函数的方式相似。
描述类别的快速方法是它们在运行时将附加方法修补到现有类上,并且它们使用@interface [classname] ([category name]) 语法,没有成员变量部分。我相信你的教程会用到,Apple 的文档是here。这是类别的常见用途,但不是主要用途。
【讨论】:
谢谢,效果很好!我也错过了声明另一种方法,但是当我这样做时,一切正常。【参考方案2】:要解决“WKDShape 可能无法响应”警告,请确保在 -mouseDragged:
之前声明 -newBoundsFromBounds:forHandle:withDelta:
。您可以将其添加到“WKDShape.h”中的公共接口,或“WKDShape.m”中的anonymous category。
【讨论】:
以上是关于帮助 Wikibooks WikiDraw Obj-C 应用程序的主要内容,如果未能解决你的问题,请参考以下文章