Ios 用于Swift的Facebook SDK 4.1。用于共享和登录的单个按钮

Ios 用于Swift的Facebook SDK 4.1。用于共享和登录的单个按钮,ios,facebook,swift,facebook-login,facebook-sdk-4.0,Ios,Facebook,Swift,Facebook Login,Facebook Sdk 4.0,我的应用程序中有一个YouTube播放器,我正在尝试在上面添加一个Facebook共享按钮,这样用户就可以共享YouTube视频 我正在使用Facebook SDK 4.1,我已经成功实现了登录和共享功能。但现在,如果我需要首先登录并共享链接 如何合并这两个进程,使我只有共享按钮,如果用户未登录,单击此按钮时,将显示登录视图,如果用户已登录,则链接将被共享。所以我需要在share按钮中调用login函数。但由于我是swift新手,我看不到点击操作在哪里,也看不到我如何在不点击登录按钮的情况下实现

我的应用程序中有一个YouTube播放器,我正在尝试在上面添加一个Facebook共享按钮,这样用户就可以共享YouTube视频

我正在使用Facebook SDK 4.1,我已经成功实现了登录和共享功能。但现在,如果我需要首先登录并共享链接

如何合并这两个进程,使我只有共享按钮,如果用户未登录,单击此按钮时,将显示登录视图,如果用户已登录,则链接将被共享。所以我需要在share按钮中调用login函数。但由于我是swift新手,我看不到点击操作在哪里,也看不到我如何在不点击登录按钮的情况下实现登录功能

这是我的密码:

let contentURL = "https://www.youtube.com/watch?v=jBsPZV14I-k"
let contentURLImage = "http://img.youtube.com/vi/jBsPZV14I-k/0.jpg"
let contentTitle = "sdasfdfsa"
let contentDescription = "asdsadasdasd"

override func viewDidLoad() {
    super.viewDidLoad()

    if (FBSDKAccessToken.currentAccessToken() != nil)
    {   
        let loginView : FBSDKLoginButton = FBSDKLoginButton()
        self.view.addSubview(loginView)
        loginView.center = self.view.center
        loginView.readPermissions = ["public_profile", "email", "user_friends"]
        loginView.delegate = self
        self.returnUserData()
        self.showShareButtons()
    }
    else
    {
        let loginView : FBSDKLoginButton = FBSDKLoginButton()
        self.view.addSubview(loginView)
        loginView.center = self.view.center
        loginView.readPermissions = ["public_profile", "email", "user_friends"]
        loginView.delegate = self  
    }
}

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
    println("User Logged In")

    if ((error) != nil)
    {
        // Process error
    }
    else if result.isCancelled {
        // Handle cancellations
    }
    else {
        if result.grantedPermissions.contains("email")
        {
            // Do work
        }
        self.returnUserData()
        self.showShareButtons()
    }  
}

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
    println("User Logged Out")
}

func returnUserData()
{
    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in   
        if ((error) != nil)
        {
            // Process error
            println("Error: \(error)")
        }
        else
        {
            println("fetched user: \(result)")
            let userName : NSString = result.valueForKey("name") as! NSString
            println("User Name is: \(userName)")
            let userEmail : NSString = result.valueForKey("email") as! NSString
            println("User Email is: \(userEmail)")
        }
    })
}

func showShareButtons()
{
    self.showLinkButton()
}

func showLinkButton()
{
    let content : FBSDKShareLinkContent = FBSDKShareLinkContent()
    content.contentURL = NSURL(string: self.contentURL)
    content.contentTitle = self.contentTitle
    content.contentDescription = self.contentDescription
    content.imageURL = NSURL(string: self.contentURLImage)

    let button : FBSDKShareButton = FBSDKShareButton()
    button.shareContent = content
    button.frame = CGRectMake((UIScreen.mainScreen().bounds.width - 100) * 0.5, 50, 100, 25)
    self.view.addSubview(button) 
}

当用户未登录但仍点击共享按钮时,我为共享做了这项工作。我弹出FBLogin窗口,当用户成功登录后,我使用此代码共享游戏分数。请注意,此功能只工作一次(或在重新登录后启用)

这是FB框架的委托方法。当用户登录状态更改时,它将得到响应

- (void)sessionStateChanged:(FBSession *)session state:(FBSessionState) state error:(NSError *)error
{
    if (!error && state == FBSessionStateOpen)
    {
        //log in

        NSUserDefaults *def=[NSUserDefaults standardUserDefaults];
        NSArray *arr=[def objectForKey:@"fbShare"];
        if (arr.count>0)
        {
            int score=[[arr objectAtIndex:0]intValue];
            int hScore=[[arr objectAtIndex:1]intValue];
            int level=[[arr objectAtIndex:2]intValue];
            BOOL isArcade=[[arr objectAtIndex:3] boolValue];
            ShareScoreFB *share=[[ShareScoreFB alloc]init];
            [share shareToFacebookCurrentScore:score andHighScore:hScore forLevel:level forArcade:isArcade];
            [def removeObjectForKey:@"fbShare"];
            [def synchronize];
        }
        return;
    }
}

你可以把你想分享的东西储存在某处。检查您是否已成功登录,然后发布该事件。我不确定您的意思是将您想要的内容存储在某个位置,因为如果您这样认为,该链接存储在一个变量中。这可能是任何内容,但您需要共享某些内容,并且该内容可能属于其他目标。因此,将其保存在某处(作为文件或对象)意味着“存储您想要共享的内容”在某处(对象或文件)。在这里,它是一个字符串对象。只要在收到响应后检查用户是否成功登录,检索数据,发布并共享。当用户成功登录时,不需要调用共享事件(仅一次)。在下一次加载之前,您不需要更改按钮。当用户重新加载页面或通过任何其他事件时,首先检查用户是否已登录,如果他或她已登录,只需显示共享按钮。谢谢,但我不知道Obj-C上的任何内容,而且据我所知,我以前也实现过类似的功能。我需要以某种方式消失的登录按钮,只有分享按钮总是。如果您登录,共享按钮将始终显示不止一次。但是再次感谢您,您可以从这里存储登录标志的状态。设置共享(或登录)按钮时使用该标志。