在 Swift 中将字符串从函数返回到按钮操作

Returning string from function into button action in Swift

我正在尝试从解析中获取(在函数中)查询的字符串,并将其 return 发送到按钮操作,该操作将 returned 字符串作为 URL 发送.

之前我是在Viewdidload内部查询,但是由于范围太小,我在Viewdidload外部放置了一个新的函数。新函数应该 return 一个字符串,然后我可以在按钮操作中将其用作 URL(我 returning 的字符串是 URL)。

我尝试在视图顶部声明变量 class,但它没有在函数内部注册 "Q3"。

使用我当前的代码,如果我按下按钮,应用程序就会崩溃。

这是我的代码:

class ViewController: UIViewController {

    @IBAction func gridButtonURL(sender: AnyObject) {
        let gridurl = Q3()
        UIApplication.sharedApplication().openURL(NSURL(string: "http://\(gridurl)")!)
    }

    override func viewDidLoad() {

        super.viewDidLoad()

        var query3 = PFQuery(className:"TestObject")
        query3.getObjectInBackgroundWithId("XXXXXXXXXX") {
            (gridExplain: PFObject?, error: NSError?) -> Void in
            if error == nil && gridExplain != nil {
                print(gridExplain)
                self.gridExplain.text = gridExplain!.objectForKey("text") as! String
            } else {
                print(error)
            }
        }

        var test = Q3()
        print("---------",test);
        //"test" is blank

    }
    //End of viewdidload

    func Q3 () -> String {
        var getGridURL = String()
        var query4 = PFQuery(className:"TestObject")
        print("enterQ3")
        query4.getObjectInBackgroundWithId("XXXXXXXXXX") {
            (gridURL: PFObject?, error: NSError?) -> Void in
            if error == nil && gridURL != nil {
                getGridURL = gridURL!.objectForKey("text") as! String
                print("f3") //it prints "f3"
                print(getGridURL)
                //it prints getGridUrl
            } else { 
                print("errorQ3") 
            } 
        }
        return getGridURL
        //doesn't  get here though because it's nil
    }

}

"query3" 变量及其随行人员在 Viewdidload 中完美运行,并无误地打印到名为 "gridExplain" 的 uiLabel。

在 Xcode 底部的输出栏中,它在 "Q3" 函数的中间打印 "print(getGridURL)",在这种情况下是 http://www.instagram.com/.

但是,此时:

print("---------",test);

它打印破折号而不是 "test",因为它是空白的,除了我不明白为什么。似乎 "Q3" 不是 return 字符串 "getGridURL".

我不知道我的问题是范围还是 returning 位。也可能是-

var getGridURL = String()

-初始化部分。

我需要知道如何将 return 字符串 "var getGridURL" 作为 "Q3" 放入 class 顶部的按钮操作中,这反过来会改变"let gridurl" 里面的动作。

尝试这样的事情:

@IBAction func gridButtonURL(sender: AnyObject) {
    var query4 = PFQuery(className:"TestObject")
    query4.getObjectInBackgroundWithId("XXXXXXXXXX") { (gridURL: PFObject?, error: NSError?) in
        if error == nil && gridURL != nil {
            getGridURL = gridURL!.objectForKey("text") as! String
            UIApplication.sharedApplication().openURL(NSURL(string: "http://\(getGridURL)"))
        } else { 
            print("errorQ3") 
        } 
    }
}

您的问题是您的 PF 查询 运行 在后台而不是在主线程中。您需要确保使用 and/or return 闭包内的字符串,或者更好地传递另一个 "completion closure" 来执行。

注意:如果您不了解异步性,使用 getObjectWithId 而不是 getObjectInBackgroundWithId 可能会解决大部分问题。然而,这将阻塞主线程,直到您的数据被 returned,这不是最佳做法。