Swift:“在展开Optional值时意外发现nil”

时间:2015-11-13 10:16:34

标签: ios swift facebook-ios-sdk

所以对我正在做的事情的一般见解是实现登录和注销到Facebook并检索个人资料图片,名称,ID。

登录过程并检索信息正在运行但我的问题在于我尝试注销时。我主要有具有注销按钮的ExploreViewController,而MeViewController是我调用的功能,用于设置显示其他信息的标签

ExploreViewController:

@IBOutlet weak var LogoutButton: UIButton!

@IBAction func LogoutButtonClicked(sender: AnyObject!)

{
    let me = MeViewController()
    me.releseObjects()

}

我成功地召集了IBAction

MeViewController:

@IBOutlet weak var idlable: UILabel!
@IBOutlet weak var firstName: UILabel!
@IBOutlet weak var imgProfile: UIImageView!

override func viewDidLoad() {

    super.viewDidLoad()




    if((FBSDKAccessToken.currentAccessToken()) != nil)
    {
        let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"name,id,email"])
        graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in


            if ((error) != nil)
            {

            }
            else
            {

                let userName : NSString = result.valueForKey("name") as! NSString
                let userid : NSString = result.valueForKey("id") as! NSString
                self.firstName.text=userName as String
                self.idlable.text=userid as String


                let accessToken = FBSDKAccessToken.currentAccessToken().tokenString
                let url = NSURL(string: "https://graph.facebook.com/me/picture?type=large&return_ssl_resources=1&access_token="+accessToken)
                _ = NSURLRequest(URL: url!)
                let data=NSData(contentsOfURL: url!)

                    // Display the imag
                    let image = UIImage(data: data!)
                    self.imgProfile.image = image
            }
        })
    }


 func releseObjects(){

    let fn = "lolololol"

    self.firstName.text = fn //getting the error here
   }

我成功将firstName Label设置为我在viewDidLoad()中从Facebook获得的用户名,我的问题是当我调用函数releaseObjects()

时我无法更改标签的内容

2 个答案:

答案 0 :(得分:0)

您正在此处MeViewController创建新实例,这是崩溃的原因。

//ExploreViewController:
@IBOutlet weak var LogoutButton: UIButton!
@IBAction func LogoutButtonClicked(sender: AnyObject!)
{
    let me = MeViewController()
    me.releseObjects()
}

更好地实施delegate/callbackHandler/Notification赞。

//MeViewController
override func viewDidLoad() {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "releseObjects", name: "Logout", object: nil)
}

func releseObjects(){
    self.firstName.text = "lolololol"  
}


ExploreViewController
@IBAction func LogoutButtonClicked(sender: AnyObject!){
    NSNotificationCenter.defaultCenter().postNotificationName("Logout", object: nil)
}

答案 1 :(得分:0)

问题是您是从MeViewController创建ExploreViewController的新实例并尝试调用releseObjects方法:

let me = MeViewController()
me.releseObjects()

它是一个新对象,而不是您之前使用过的对象。由于没有出现,出口没有连接(它是零)。当您尝试访问firstName标签时,它肯定会崩溃。

我建议您重新使用MeViewController的实际对象,而不是创建新对象。