Ios 通过在类别中添加属性向类添加属性时,获取;无法识别的选择器…”;
我尝试在SKSpriteNode上进行扩展,并尝试了几种方法(通过在新类中建立关系,通过直接扩展关系),最后我想尝试使用类别进行扩展。因此,我使用助手在XCode中以正确的方式创建了一个类别,并选择SKSpriteNode作为该类别的类。我在现有类的基础上进行了扩展,创建了一个新文件,其中包含名为SKSpriteNode+StaticLevelElement.h和SKSpriteNode+StaticLevelElement.m的其他方法和属性。由于某些原因,我无法添加属性。我试过了Ios 通过在类别中添加属性向类添加属性时,获取;无法识别的选择器…”;,ios,objective-c,xcode,objective-c-category,Ios,Objective C,Xcode,Objective C Category,我尝试在SKSpriteNode上进行扩展,并尝试了几种方法(通过在新类中建立关系,通过直接扩展关系),最后我想尝试使用类别进行扩展。因此,我使用助手在XCode中以正确的方式创建了一个类别,并选择SKSpriteNode作为该类别的类。我在现有类的基础上进行了扩展,创建了一个新文件,其中包含名为SKSpriteNode+StaticLevelElement.h和SKSpriteNode+StaticLevelElement.m的其他方法和属性。由于某些原因,我无法添加属性。我试过了 为类别的.
// 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);
}
//SKSpriteNode+StaticLevelElement.m
#进口
#导入“SKSpriteNode+StaticLevelElement.h”
NSString*常量gamePlayLogicSelector=@“gamePlayLogic”;
NSString*const pseudoDepthSelector=@“pseudoDepth”;
@实现SKSpriteNode(StaticLevelElement)
@动态游戏逻辑;
@动态伪深度;
@动态名称;
@动态游戏场景;
-(无效)设置伪深度:(浮动)pd
{
objc_setAssociatedObject(self,(uu bridge const void*)(伪深度选择器),pd,objc_ASSOCIATION_COPY);
}
最后一行导致错误“将'float'传递给不兼容类型'id'的参数”
我这里缺少什么?关联对象是正确的方法。您应该添加显示您尝试的代码。同意w/@dan;还有关联策略(objc\u setAssociatedObject()的最后一个参数)可能应该是
OBJC\u ASSOCIATION\u RETAIN\u NONATOMIC
而不是OBJC\u ASSOCIATION\u COPY
,但是YMMV;您应该仔细阅读一下该参数,以确保获得适合您的情况的正确语义。实际上,我将float属性切换为NSNumber,根据相关对象的教程,它现在似乎可以工作了。现在另一个问题出现了,其他一些SKSpriteNode-s刚刚消失,我记录了它们,它们似乎存在,但大小为0,0…..这些对象也添加到场景编辑器的可视化编辑器中。更改为NSNumber
会起作用,因为您使用的是关联对象,这是一种对象类型。但是float
是一种值类型或POD(普通旧数据类型)在C-ese中,而不是对象。至于你的另一个问题,听起来你需要问一个新问题。HTHSo你刚才提出了和我一样的问题。如何将POD属性添加到类别中?对此有什么建议吗?谢谢!关联对象是正确的方法。你应该添加显示你尝试的代码。同意w/@dan;还有,As关联策略(objc\u setAssociatedObject()的最后一个参数)可能应该是OBJC\u ASSOCIATION\u RETAIN\u NONATOMIC
而不是OBJC\u ASSOCIATION\u COPY
,但是YMMV;您应该仔细阅读一下该参数,以确保获得适合您的情况的正确语义。实际上,我将float属性切换为NSNumber,根据相关对象的教程,它现在似乎可以工作了。现在另一个问题出现了,其他一些SKSpriteNode-s刚刚消失,我记录了它们,它们似乎存在,但大小为0,0…..这些对象也添加到场景编辑器的可视化编辑器中。更改为NSNumber
会起作用,因为您使用的是关联对象,这是一种对象类型。但是float
是一种值类型或POD(纯旧数据类型)而不是对象。至于您的另一个问题,听起来您需要问一个新问题。HTHSo您刚才提出了与我相同的问题。如何将POD属性添加到类别?对此有任何建议吗?谢谢!