繁体   English   中英

在IBAction之外快速获取更新变量

[英]Getting updated variable outside IBAction swift

我很难过,想知道如何获取更新facebookProfileUrl以便可以将图像放在单元格的imageview中。 正如您在代码中看到的那样,我已经在页面顶部使用var facebookProfileUrl创建了实例。 在代码的底部,您可以看到,如果facebookProfileUrl为空,它将这样说-这就是该代码的作用。 即使我在代码中间更改了facebookProfileUrl,也没有任何反应。 我该怎么做才能解决此问题?

var facebookProfileUrl = "" // THIS IS BEFORE viewDidLoad



@IBAction func addToFeed(sender: AnyObject) {
    let accessToken = FBSDKAccessToken.currentAccessToken()
    if(accessToken != nil) //should be != nil
    {
        let req = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"id"], tokenString: accessToken.tokenString, version: nil, HTTPMethod: "GET")
        req.startWithCompletionHandler({ (connection, result, error : NSError!) -> Void in
            if(error == nil)
            {
                let userId: String? = result.valueForKey("id") as? String
                let userID = userId
                self.facebookProfileUrl = "http://graph.facebook.com/\(userID)/picture?type=large" // HERE I AM CHANGING THE VARIABLE

                let feed = Sweet(content: feedContent, addedByUser: name!, profilePhoto: self.facebookProfileUrl)
                let feedRef = self.dbRef.child(feedContent.lowercaseString)

                feedRef.setValue(feed.toAnyObject())

            }
            else
            {
                print("error \(error)")
            }
        })
    }
}





override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell:updateTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! updateTableViewCell


    let update = updates[indexPath.row]


    cell.nameLabel.text = update.addedByUser
    cell.updateLabel.text = update.content


    if (facebookProfileUrl != "") {
        if let url = NSURL(string: facebookProfileUrl) {
            if let data = NSData(contentsOfURL: url) {
                cell.picView.image = UIImage(data: data)
            }
        }
    } else {
        print("Empty facebookProfileUrl") // THIS ONE IS PRINTED
    }



    return cell
}

您应该在完成块中调用self.tableView.reloadData() (我建议作为if error == nil条件的最后一行)

如上所述,这是一个异步调用,这意味着在服务器响应之后,将调用该块req.startWithCompletionHandler({ ... })中的代码。 至此,tableView可能已经加载了它的数据(换句话说,已经为屏幕上当前的所有单元格调用了cellForRowAtIndexPath)。

不过要小心! 我不确定您到底要完成什么,还没有看到所有代码,但是在执行此操作时,所有单元格都具有相同的url。 在没有更多信息的情况下,很难推荐一种更好的方法来做到这一点,但要提防。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM