简单 - 我无法访问方法A中方法A中声明的对象

时间:2014-02-15 15:09:40

标签: ios objective-c sprite-kit

这是我的代码。

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        CGPoint boxPosition = CGPointMake(100,100);
        SKSpriteNode *box = [SKSpriteNode spriteNodeWithColor:[SKColor colorWithRed:0.18 green:0.702 blue:0.91 alpha:0.5] size:CGSizeMake(35,25)];
        box.position = boxPosition;
        [self addChild:box]; 
    }
}


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
    CGPoint touchPoint = [touch locationInNode:self];

        if (CGRectContainsPoint(box.frame, touchPoint)) {
            // DO SOMETHING;
        }
    }
}

我想在box方法中访问touchesBegan,但我不能。我真的不确定为什么。

3 个答案:

答案 0 :(得分:1)

问题是您的变量仅在if (self = [super initWithSize:size])范围内。有几种方法可以解决这个问题。您可以像其他答案一样建议并创建一个属性,您可以使用该属性从该类的实例访问该变量。或者,您可以利用SKNode的{​​{1}}属性:

name

然后,您可以使用SKSpriteNode *box = [SKSpriteNode spriteNodeWithColor:[SKColor colorWithRed:0.18 green:0.702 blue:0.91 alpha:0.5] size:CGSizeMake(35,25)]; [box setName:@"aCoolName"]; 的{​​{1}}在触摸开始时获取对该子节点的引用。

SKNode

答案 1 :(得分:0)

因为它是initWithSize:方法中的局部变量(实际上是该方法中if块的本地变量),所以,在该方法完成后,该变量不可访问。创建的对象已添加为child,因此您可以搜索它...

您需要创建一个实例变量(`@property')并设置它,然后您可以在任何实例方法中访问它。这可能是在.h文件中(其他类需要访问它),或者在.m文件中(如果其他类不需要访问,则最好在延续类别中)。

答案 2 :(得分:0)

在* .h文件中定义SKSpriteNode *框

@property (nonatomic, retain) SKSpriteNode *box;

然后用你的* .m文件中的touchesBegan访问它

@synthesize box 

* .m中的代码将如下所示。

box = [SKSpriteNode spriteNodeWithColor:[SKColor colorWithRed:0.18 green:0.702 blue:0.91 alpha:0.5] size:CGSizeMake(35,25)];

或者如果您愿意,可以在* .h文件中将其定义为

@interface v1ViewController : UIViewController
{
   SKSpriteNode *box;
}

然后像

一样使用它
_box = [SKSpriteNode spriteNodeWithColor:[SKColor colorWithRed:0.18 green:0.702 blue:0.91 alpha:0.5] size:CGSizeMake(35,25)];