在 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,这不是最佳做法。
我正在尝试从解析中获取(在函数中)查询的字符串,并将其 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,这不是最佳做法。