如何使用社交框架呈现来自 SKscene 的 UIViewController? [英] How do I present UIViewController from SKscene with social framework?
问题描述
我正在制作像 Flappy Bird 这样的游戏.如何呈现来自 SKScene 的 UIViewController?首先,我告诉我的环境
I am making a game like Flappy Bird. How do I present a UIViewController from SKScene? First of all, I tell my environments
- Mac OS X 10.9
- Xcode 5.0.2
- Sprite Kit(framework), social.framework(framework) 已添加到我的项目中
我的目标是在游戏结束时显示分享"按钮.点击分享按钮图像应该会显示一个 SLComposeViewController (Twitter Share).场景内容不应改变.
我想解决以下问题并将显示从 GameOverScene 更改为 tweetSheet(display)由 social.framework 组成.
My goal is to display a "Share" button upon Game Over. Tapping the share button image should present a SLComposeViewController (Twitter Share). The contents of the scene should not change.
I'd like to solve bellow issue and change display from GameOverScene to tweetSheet(display)
composed with social.framework.
问题
[self presentViewController:tweetSheet animated:YES completion:nil];
//Error:No visible @interface for 'GameOverScene' declares the selector "presentViewController":animated:completion:
我的编码文件如下(我提取了部分重要代码).
My coding files are below(I extracted parts of important codes).
ViewController.h
ViewController.h
import <UIKit/UIKit.h>
import <SpriteKit/SpriteKit.h>
import <iAd/iAd.h>
@interface ViewController : UIViewController<ADBannerViewDelegate><br>
@end
GameOverScene.h
GameOverScene.h
#import <SpriteKit/SpriteKit.h>
@class SpriteViewController;
@interface GameOverScene : SKScene {
}
@end
GameOverScene.m
GameOverScene.m
#import "GameOverScene.h"
#import "NewGameScene.h"
#import "MainScene.h"
#import <Social/Social.h>
@implementation GameOverScene {
//The twitter button
SKSpriteNode *_twitterbutton;
}
- (id)initWithSize:(CGSize)size
{
if (self = [super initWithSize:size]) {
//Creating the twitterbutton with the twitterbutton image from Images.xcassets
_twitterbutton = [SKSpriteNode spriteNodeWithImageNamed:@"twitterbutton"];
[_twitterbutton setSize:CGSizeMake(50, 50)];
[_twitterbutton setPosition:CGPointMake(self.size.width/2, self.size.height/5 + 50)];
//Adding the twitter button
[self addChild:_twitterbutton];
//Again, this is important, otherwise we can't identify what button is pressed
_twitterbutton.name = @"twitterbutton";
[_twitterbutton setPosition:CGPointMake(self.size.width/2, self.size.height/5 + 50)]
}
return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//Same as in NewGameScene menu
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:location];
//Is the twitter button touched?
if([node.name isEqualToString:@"twitterbutton"]){
if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]){
SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[tweetSheet setInitialText:@"TestTweet from the Game !!"];
[self presentViewController:tweetSheet animated:YES completion:nil];
**//Error:No visible @interface for 'GameOverScene' declares the selector "presentViewController":animated:completion:**
}
}
ViewControlloer.m
ViewControlloer.m
#import "ViewController.h"
#import "NewGameScene.h"
@implementation ViewController
//Loads the view onto our main class
- (void)loadView
{
self.view = [[SKView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
}
//Executes when view finishes loading
- (void)viewWillLayoutSubviews
{
[super viewDidLoad];
//Set the resize mode to flexible width and height
[self.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
//Create our view from our original view
//Make sure to leave originalContentView in, otherwise the app will crash
SKView *skView = (SKView *)self.originalContentView;
//We create a new NewGameScene according to the current dimensions
SKScene *scene = [NewGameScene sceneWithSize:skView.bounds.size];
//Create a transition class with animation type fade and a duration of .4 seconds
SKTransition *transition = [SKTransition fadeWithDuration:.4];
//Present the menu view (NewGameScene) with our fade in transition
[skView presentScene:scene transition:transition];
}
@end
推荐答案
您不能在 SKScene 中呈现 viewController,因为它实际上只在 SKView 上呈现.您需要一种向 viewController 发送消息的方法,然后 viewController 将呈现 viewController.为此,您可以使用委托.
You cannot present a viewController from within a SKScene as it is actually only being rendered on a SKView. You need a way to send a message to the viewController, which in turn will present the viewController. For this, you can use delegation.
将以下协议定义添加到您的 SKScene 的 .h 文件中:
Add the following protocol definition to your SKScene's .h file:
@protocol sceneDelegate <NSObject>
-(void)showShareScreen;
@end
并在接口中声明一个委托属性:
And declare a delegate property in the interface:
@property (weak, nonatomic) id <sceneDelegate> delegate;
然后,在您要显示共享屏幕的位置,而不是行:
Then, at the point where you want to present the share screen, instead of the line:
[self presentViewController:tweetSheet animated:YES completion:nil];
使用这一行:
[self.delegate showShareScreen];
现在,在 viewController 的 .h 文件中,实现协议:
Now, in your viewController's .h file, implement the protocol:
@interface ViewController : UIViewController <sceneDelegate>
并且,在您的 .m 文件中,在呈现场景之前添加以下行:
And, in your .m file, add the following line before you present the scene:
scene.delegate = self;
然后在此处添加以下方法:
Then add the following method there:
-(void)presentShareScreen
{
if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])
{
SLComposeViewController *tweetSheet = [SLComposeViewController
composeViewControllerForServiceType:SLServiceTypeTwitter];
[tweetSheet setInitialText:@"TestTweet from the Game !!"];
[self presentViewController:tweetSheet animated:YES completion:nil];
}
}
另一种方法是使用 NSNotificationCenter
保持 -presentShareScreen
方法如前一个替代方案所述.
Keep the -presentShareScreen
method as described in the previous alternative.
在它的 -viewDidLoad
方法中添加 viewController 作为通知的监听器:
Add the viewController as a listener to the notification in it's -viewDidLoad
method:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(presentShareScreen) name:@"showShareScreen" object:nil];
然后,在场景中要显示此 viewController 的位置,使用以下行:
Then, in the scene at the point where you want to show this viewController, use this line:
[[NSNotificationCenter defaultCenter] postNotificationName:@"showShareScreen" object:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"showShareScreen" object:nil];
这篇关于如何使用社交框架呈现来自 SKscene 的 UIViewController?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!