目的:
在用户界面的“文本”字段中键入数字。按“GO!”按钮(用户界面)和: 1.文本字段中的数字作为post变量传递到PHP脚本(通过NSURLSession..dataTaskWithRequest)。
2.PHP脚本将该变量用作MySQL查询的一部分。
3.查询结果返回到iOS App
4.查询结果显示在文本视图(用户界面)
中设定:
在ViewController类中,我编写了一个额外的函数“mysqlget(MyNum:Int)”,它将数字转换为我的NSMutableURLRequest的HTTPBody。函数继续设置NSURLSession,设置dataTaskwithRequestTask并“恢复”即启动任务。
我的“去!”用于touchupinside的@IBActon设置按钮(也位于ViewController类中)的代码为:
1.检查在文本字段中输入的字符串是否为字符串
2.如果文本字段不是数字,则发出警告
3.调用mysqlget函数传递文本域号。
4.将Textview.text(不是文本字段)更改为包含dataTaskWithRequest任务内部数据的变量。
问题:
dataTaskWithRequest中数据变量的范围是有限的 到dataTaskwithRequest体内。甚至在mysqlget里面 函数,就在myDataTask.resume()之后不再是变量 存在。显然,我无法将变量传递回@IBAction 走!按钮。
解决方案失败:
在我的datataskwithrequest上放置一个“ - > NSString”而不是void(块应该在Call Handler结束时终止)
设置mysqlget以返回NSString并且mysqlget的最后一行包含“return data_frominside_datataskwithrequest” - 数据无法在请求之外生存
尝试从dataTaskWithRequest块内部更新Textview.text - 即使textview的@IBOutlet在顶部声明正确,当我尝试执行“textview.text = data”时,xcode会提示 - 必须使用“自我”。暗示它看不到@IBOutlet?使用self.textview.text允许程序运行,但一旦到达该行就会崩溃。
(我知道这通常很糟糕)在ViewController之外声明一个全局变量并使globalvariable = data。不知何故,变量仍为空白。
我已经测试了代码,所有部分都可以在myDataTask中获取我需要的数据。我唯一不能做的就是将数据传输到myDataTask之外
示意图:
var attemptedGlobalVar: String = ""
class ViewController {
@IBOutlet myNum
@IBOutlet TextField
@IBAction GoClicked {
.
.
[code to validate myNum]
.
.
mysqlget(Int(myNum.text))
Textfield.text = data_I_need //nothing returns here
[This is where I want to process my "data_I_need"]
}
override func viewDidLoad {
[default stuff]
}
override func didReceiveMemoryWarning {
[default stuff]
}
func mysqlget(aNum: Int) {
[Setup NSURL]
[Setup POST string]
[Setup NSMutableURLRequest (HTTPMethod, HTTPBody)]
let myDataTask = NSURLSessions.sharedSession().dataTaskWithRequest (myRequest, completion handler: {(requestData, requestResponse, requestError) -> Void in
data_I_need = (NSString(data: requestData, encoding: NSUTF8StringEncoding))!
[data_I_need exists here]
[setting TextField.text = data_I_need xcode warns I need to use self.TextField.text]
}
myGetTask.resume()
[data_I_need is blank here]
}
}
简明扼要的问题:
很抱歉问题的长度。我只想提供完整的上下文。如果您想提出其他建议(希望作为我所期望的行动的替代方案),请告诉我。我的编程经验有限,欢迎任何意见或建议。谢谢。
答案 0 :(得分:1)
一种方法(还有很多其他方法):
// Somewhere outside of your "mysqlget":
func recordMyData(myString: NSString) {
// do whatever you want with myString here, it is now outside the closure
myTextField.text = myString
}
// Call the "recordMyData" method from inside the closure to pass the response to it
let myDataTask = NSURLSessions.sharedSession().dataTaskWithRequest(myRequest, completion handler: {(requestData, requestResponse, requestError) -> Void in
self.recordMyData(NSString(data: requestData, encoding: NSUTF8StringEncoding)!)
})