如何使用SKSceneDelegate(和滥用)

时间:2015-08-07 09:11:55

标签: ios objective-c cocoa delegates skscene

通常我会像平常一样设置我的代表:

@interface CAKGameViewController : UIViewController <CAKGameSceneDelegate>

然后使用

跟进CAKGameScene.h
@protocol CAKGameSceneDelegate;

@interface CAKGameScene : SKScene <SKPhysicsContactDelegate>
...(properties, etc)
@protocol CAKGameSceneDelegate <NSObject>

@optional
- (void)getStarted;
@end

但是,正如我们大多数人所知道的那样,你必须像这样设置商店:

@property (nonatomic, weak, readwrite) id<CAKGameSceneDelegate> myDelegate;

我的问题是,我想使用实际的SKSceneDelegate(self.delegate,而不是(self.myDelegate)并且像这样:

@interface CAKGameViewController : UIViewController <SKSceneDelegate>

现在这很好,我可以使用self.delegate来引用控制器,但问题是我似乎无法弄清楚如何自定义CAKGameViewController,即进一步设置协议,或自定义协议,对于我的方法和/或属性。 :(

任何帮助都会有所帮助。

由于

2 个答案:

答案 0 :(得分:0)

我终于找到了一个合适的解决方法来使用和分配SKScene委托。诀窍是施放(当然是正确的)!?

您可以连接GameViewController并符合协议

在CAKGameViewController.h

@interface CAKGameViewController : UIViewController
<SKSceneDelegate, CAKGameSceneDelegate>

在CAKGameScene.h中

@protocol CAKGameSceneDelegate <NSObject>
// any @property;
// or - (void)methods;
@end

在CAKGameViewController.m中,您使用self分配代理:

self.scene.delegate = self;  //this is the Apple delegate property

然后每当你想使用

something = self.delegate.property; // <or>
[self.delegate method]; // from the CAKGameSceneDelegate protocol
你投了

something = ((id<CAKGameSceneDelegate>)self.delegate).property; // <or>
[((id<CAKGameSceneDelegate>)self.delegate) method];  // from non-apple protocol

我所做的只是制作#define

#define delegateHelper ((id<CAKGameSceneDelegate>)self.delegate)

然后我可以:

something = delegateHelper.property;
[delegateHelper method];

我只想知道你是否会像大多数cocoa / objective-c对象一样拥有一个名为delegate的属性,为了使事情有效,委托应该是委托,你不应该使用myDelegate,或者某些东西愚蠢。 delegateHelper可能不会好多少,但对我来说,我可以忍受这种解决方法。

答案 1 :(得分:0)

您可以在协议定义中扩展原始委托:

@protocol CAKGameSceneDelegate <SKSceneDelegate>
    //extend SKSceneDelegate with new functions here
@end

或者在Swift中:

protocol CAKGameSceneDelegate: SKSceneDelegate
{
    //extend SKSceneDelegate with new functions here
}

如果您这样做,则无需重新定义delegate