2014-08-31 77 views
3

嘿那里我的应用程序几乎准备好发布,但我想添加Facebook分享按钮。事情是我不知道场景和viewcontroler之间的沟通是如何工作的。我做了我的研究,但只发现在OBJ-C代码这样一个swift spritekit Facebook的分享按钮

- (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:

感谢

+0

[夫特和在同一项目中的Objective-C](https://developer.apple。 com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html),他们很容易在Swift中使用现有的Objective-C类。 – chuckus 2014-08-31 19:57:02

回答

13

这是我前段时间为twitter所做的一些代码,它仍然可以快速运行。我向你展示如何将它转换为下面的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,只需简单更换SLServiceTypeTwitterSLServiceTypeFacebook并重命名变量可读性。如果你想从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工作表。请记住将我的字符串替换为与您的项目相关的字符串。希望这会有所帮助 - 对不起,这是一个很长的答案!

+0

我可以使用Facebook徽标作为分享按钮吗?非常有用的了解了我需要的所有东西。thx – 2014-09-02 18:43:51

+0

@BasileBerckmoes我查了一下,你可以在4个(也只有4个)场景中使用“f”标志。如果你将它用于别的东西,你会违反规则。制作你想要的内容: 1.指您在Facebook上的存在,如您的Page,时间轴,群组,应用程序或事件 2.在您的网站/应用程序中暗示您实施Facebook 3.您的产品与Facebook,如'用于Facebook' 4.来自Facebook的内容 – 2014-09-02 18:47:35

+0

@BasileBerckmoes然而,如果您使用多个社交媒体(如twitter)并将徽标并排放置,那么您可以做你喜欢什么图标 - 并且规则不再适用。不知道为什么这样,但我个人会利用它,并使用我发布的相同代码添加到twitter中 - 这样您就不会违反任何版权法。希望能够解决问题。查看这个网站,了解几乎所有可能合并的公司的信息。http://www.qualitylogoproducts.com/blog/social-media-logos-promotional-items/ – 2014-09-02 18:52:32

1
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() 
} 

张贴由非常有帮助用户的OBJ-C答案的夫特转换...... original post