swift spritekit Facebook分享按钮

嘿,我的应用程序几乎准备好发布,但我想添加一个Facebook共享按钮。 事情是我不知道场景和viewcontroler之间的通信是如何工作的。 我做了我的研究,但只在obj-c中找到了像这样的代码

- (void)lkFaceBookShare { NSString *serviceType = SLServiceTypeFacebook; if (![SLComposeViewController isAvailableForServiceType:serviceType]) { [self showUnavailableAlertForServiceType:serviceType]; } else { SLComposeViewController *composeViewController = [SLComposeViewController composeViewControllerForServiceType:serviceType]; UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; CGRect rect = [keyWindow bounds]; UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0.5f); [self.view drawViewHierarchyInRect:rect afterScreenUpdates:YES]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); [composeViewController addImage:viewImage]; NSString *initalTextString = [NSString stringWithFormat:@"Let's join together in the form of underground catch word go along with me!! Link: https://itunes.apple.com/us/app/uoi-hinh-bat-chu-gioi-duoi/id907330926?ls=1&mt=8"]; [composeViewController setInitialText:initalTextString]; UIViewController *vc = self.view.window.rootViewController; [vc presentViewController:composeViewController animated:YES completion:nil]; } } - (void)showUnavailableAlertForServiceType:(NSString *)serviceType { NSString *serviceName = @""; if (serviceType == SLServiceTypeFacebook) { serviceName = @"Facebook"; } else if (serviceType == SLServiceTypeSinaWeibo) { serviceName = @"Sina Weibo"; } else if (serviceType == SLServiceTypeTwitter) { serviceName = @"Twitter"; } UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Account" message:[NSString stringWithFormat:@"Please go to the device settings and add a %@ account in order to share through that service", serviceName] delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; [alertView show]; } 

我的经验和知识太低,太快​​,所以我需要一些帮助这个D:

谢谢

这是我之前为twitter做的一些代码,它仍然可以在swift中运行。 我将向您展示如何将其转换为Facebook。 把这个你的viewController:

 func showTweetSheet() { let tweetSheet = SLComposeViewController(forServiceType: SLServiceTypeTwitter) tweetSheet.completionHandler = { result in switch result { case SLComposeViewControllerResult.Cancelled: //Add code to deal with it being cancelled break case SLComposeViewControllerResult.Done: //Add code here to deal with it being completed //Remember that dimissing the view is done for you, and sending the tweet to social media is automatic too. You could use this to give in game rewards? break } } tweetSheet.setInitialText("Test Twitter") //The default text in the tweet tweetSheet.addImage(UIImage(named: "TestImage.png")) //Add an image if you like? tweetSheet.addURL(NSURL(string: "http://twitter.com")) //A url which takes you into safari if tapped on self.presentViewController(tweetSheet, animated: false, completion: { //Optional completion statement }) } 

要将其转换为Facebook,只需将SLServiceTypeTwitter交换为SLServiceTypeFacebook并重命名变量以提高可读性。 如果要从SKScene调用此方法,则必须以某种方式警告viewController您希望它调用方法。

我首选的方法是使用NSNotificationCenter,以便我从场景发布一个警报,并由viewController接收它,以便它触发一个方法。 这也非常容易设置。 在场景中,您需要将此行代码放在您想要调用Facebook弹出窗口的任何位置:

 NSNotificationCenter.defaultCenter().postNotificationName("WhateverYouWantToCallTheNotification", object: nil) 

这会发出一个带有名称的通知。 现在,在viewController中,您需要通过将以下代码放在viewDidLoad,viewDidAppear或类似内容中来订阅此警报。

 NSNotificationCenter.defaultCenter().addObserver(self, selector: "ThisIsTheMethodName", name: "WhateverYouCalledTheAlertInTheOtherLineOfCode", object: nil) 

现在场景将与viewController进行通信,您将能够显示Facebook表格。 请记住用相对于项目的字符串替换我的字符串。 希望这会有所帮助 – 对不起,这是一个很长的答案!

 func lkFaceBookShare() { var serviceType: String = SLServiceTypeFacebook if !SLComposeViewController.isAvailableForServiceType(serviceType) { self.showUnavailableAlertForServiceType(serviceType) } else { var composeViewController: SLComposeViewController = SLComposeViewController.composeViewControllerForServiceType(serviceType) var keyWindow: UIWindow = UIApplication.sharedApplication().keyWindow var rect: CGRect = keyWindow.bounds UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, false, 0.5) self.view!.drawViewHierarchyInRect(rect, afterScreenUpdates: true) var viewImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() composeViewController.addImage(viewImage) var initalTextString: String = String(format: "Let's join together in the form of underground catch word go along with me!! Link: https://itunes.apple.com/us/app/uoi-hinh-bat-chu-gioi-duoi/id907330926?ls=1&mt=8") composeViewController.initialText = initalTextString var vc: UIViewController = self.view.window.rootViewController vc.presentViewController(composeViewController, animated: true, completion: { _ in }) } } func showUnavailableAlertForServiceType(serviceType: String) { var serviceName: String = "" if serviceType == SLServiceTypeFacebook { serviceName = "Facebook" } else if serviceType == SLServiceTypeSinaWeibo { serviceName = "Sina Weibo" } else if serviceType == SLServiceTypeTwitter { serviceName = "Twitter" } var alertView: UIAlertView = UIAlertView(title: "Account", message: "Please go to the device settings and add a \(serviceName) account in order to share through that service", delegate: nil, cancelButtonTitle: "Dismiss", otherButtonTitles: "") alertView.show() } 

Swift转换的Obj-C答案由一个非常有帮助的用户发布…… 原帖