帮助 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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 在 UITableView 中不起作用(点击时崩溃)?我可以得到一些关于 obj-c 的帮助吗

.obj 文件未加载所有子网格名称

python 常用模块

Javascript IIFE,对象[复制]

使用c ++和opengl加载.obj文件[关闭]

.obj 到 fbx 导出器,反之亦然