Swift:将 Facebook JSON 中的名称、照片和封面设置为变量不起作用。

Posted

技术标签:

【中文标题】Swift:将 Facebook JSON 中的名称、照片和封面设置为变量不起作用。【英文标题】:Swift: Setting name, photo, and cover from Facebook JSON to variables is not working. 【发布时间】:2017-06-12 08:42:45 【问题描述】:

我是使用 Facebook API 的新手,我正在尝试创建一个个人资料页面,其中包含所有从 Facebook 获取的用户姓名、个人资料图片和封面照片。我能够解析提供的 JSON 数据并获取名称、封面 url 和图片 url,但是当我尝试将它们设置为另一个类中的 IBOutlets 时,它不会改变任何东西。 UILabel 和 UIImageViews 保持不变。`

class ViewController: UIViewController, BWWalkthroughViewControllerDelegate, FBSDKLoginButtonDelegate 

var profilePageViewController : profilePage!
var profileVC = profilePage()

override func viewDidLoad() 
    super.viewDidLoad()

    let stb = UIStoryboard(name: "Main",bundle: nil)

    profilePageViewController = stb.instantiateViewController(withIdentifier: "profile") as! profilePage

    profileVC = profilePageViewController



// MARK: FACEBOOK DELEGATE

func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) 

    print("Logged out of Facebook")


func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) 

    if error != nil

        print(error)
        return
    


func showFacebookInformation()

    FBSDKGraphRequest(graphpath: "/me", parameters: ["fields": "id, name, picture.type(large),cover"]).start(completionHandler:  (connction, result, error) in

        if(error != nil)
            print("Failed to start Graph API request", error)
            return
        

        print(result)

        let result = result as! Dictionary<String,Any>

        // GETTING COVER PHOTO URL

        let cover = result["cover"] as! Dictionary<String,Any>
        let coverSource = cover["source"] as! String

        // GETTING NAME

        let name = result["name"] as! String

        // GETTING PROFILE PICTURE

        let picture = result["picture"] as! Dictionary<String,Any>
        let data = picture["data"] as! Dictionary<String,Any>
        let url = data["url"] as! String

        print("The profile picture URL is: ",url)
        print("The cover photo url is: ",coverSource)
        print("The name is: ",name)

        DispatchQueue.main.async 
            self.profileVC.profilePicture.sd_setImage(with: URL(string:url))
            self.profileVC.userName.text = name 
        
    )


@IBAction func logUserIn()

    FBSDKLoginManager().logIn(withReadPermissions: ["public_profile"], from: self)  (result, error) in

        if(error != nil)

            print("Facebook Login failed: ",error)
            return
        
        else
            self.profileVC.loadViewIfNeeded()
            self.showFacebookInformation()
            
        
    


【问题讨论】:

通过 segue 传递详细信息并将值分配给该视图控制器的 viewDidLoad() 中的插座。您不能像这样直接分配值。 【参考方案1】:

我可以看到您正在尝试从您已实例化的 Viewcontroller 设置 UILabel 和 UIImageView,而不是将数据传递到配置文件 viewcontroller 并在其 viewdidload 或 viewwillappear 方法中设置值。发生这种情况是因为尚未准备好布局。

【讨论】:

感谢您的评论。我使用 self.profileVC.loadViewIfNeeded() 的事实不是已经加载了配置文件视图控制器吗?

以上是关于Swift:将 Facebook JSON 中的名称、照片和封面设置为变量不起作用。的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 Facebook 游戏请求

无法将 FBSDKLoginKit 添加到 Swift 4 中的 Pod

swift中的Facebook Native Share对话框

如何在 Swift 中从 Facebook 获取用户名

Swift Alamofire 意外发现 nil - Facebook API

Swift 中的 Facebook 登录管理器“表达式不明确”错误