我尝试扩展SKSpriteNode,尝试了几种方法(通过在新类中建立关系,直接扩展它),最后我想尝试使用类别。因此,我使用助手在XCode中创建一个正确的类别,并选择SKSpriteNode作为类别的类。我扩展了现有的类,并使用名为SKSpriteNode + StaticLevelElement.h和SKSpriteNode + StaticLevelElement.m的其他方法和属性创建一个新文件。出于某种原因,我无法添加属性。我试过了
在类别的.m文件中为新属性添加setter和getter方法,但仍然收到消息“无法识别的选择器已发送到实例”。
在类别实现中的每个新属性前面添加@dynamic,结果与上面相同。
在构建设置中尝试设置其他链接器标记,得到与上面相同的结果。
尝试使用关联对象(http://www.davidhamrick.com/2012/02/12/Adding-Properties-to-an-Objective-C-Category.html),结果相同。
有什么建议吗?我很想使用类别,我仍然不想放弃它,因为我看到它们有多酷,在XCode可视化编辑器中使用精灵,而不仅仅是以编程方式,使得很容易看到结果直接,而不是必须扩展课程并以编程方式完成所有事情,并希望获得良好的游戏外观和感觉。
相关代码:
// SKSpriteNode+StaticLevelElement.m
#import <objc/runtime.h>
#import "SKSpriteNode+StaticLevelElement.h"
NSString * const gamePlayLogicSelector = @"gamePlayLogic";
NSString * const pseudoDepthSelector = @"pseudoDepth";
@implementation SKSpriteNode (StaticLevelElement)
@dynamic gamePlayLogic;
@dynamic pseudoDepth;
@dynamic theName;
@dynamic gameScene;
- (void)setPseudoDepth:(float)pd
{
objc_setAssociatedObject(self, (__bridge const void *)(pseudoDepthSelector), pd, OBJC_ASSOCIATION_COPY);
}
最后一行导致错误“将'浮动'传递给不兼容类型'id'的参数。
我在这里缺少什么?