在 swift 中解析时无法在 json post 请求参数中添加文本字段输入的文本
Unable to add textfield entered text in json post request parameter while parsing in swift
最初我从之前的 viewcontroller 获取文本字段文本,以了解要在当前视图控制器中添加哪些文本。如果我点击文本字段,以前的文本将是空的,我正在添加文本,但我无法添加当前视图控制器 post 参数的文本。这里我也得到以前的视图控制器文本。
这是我的代码:
@IBOutlet weak var tableView: UITableView!
var cell : BillerTableViewCell?
var textFieldArray = [String]()
var selectedBiller: JsonDataBiller?
var toplabeText: String?
var textFieldValue: String?
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
cell = tableView.dequeueReusableCell(withIdentifier: "textfieldCell", for: indexPath) as! BillerTableViewCell
cell?.searchTextfield.delegate = self
if let param = selectedBiller?.bcustomerparms[indexPath.row] {
cell?.searchTextfield.text = param.paramName
textFieldValue = cell?.searchTextfield.text
} else {
cell?.searchTextfield.text = "missing data"
}
return cell!
}
func textFieldDidBeginEditing(_ textField: UITextField) {
textField.text = ""
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
@objc func buttonClicked(sender: UIButton) {
billerFetchService()
}
func billerFetchService(){
print("fetch paramname \(textFieldKey)")
// var textFieldValue: String = (cell?.searchTextfield.text)!
let parameters = ["billDetails": [
"billerId" : "EPDCLOB00ANP01",
"customerParams" : [["name": textFieldKey,"value": textFieldValue]]]] as [String : Any]
print("the textfield value is \(textFieldValue)")
let url = URL(string: "https://app.com/emi_v1/fetch")
var req = URLRequest(url: url!)
req.httpMethod = "POST"
req.addValue("application/json", forHTTPHeaderField: "Contet-Type")
req.addValue("application/json", forHTTPHeaderField: "Accept")
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) else {return}
req.httpBody = httpBody
let session = URLSession.shared
session.dataTask(with: req, completionHandler: {(data, response, error) in
if response != nil {
// print(response)
}
if let data = data {
do{
var json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
// print("fetching json \(json)")
let fetchStatus = json["status"] as? String
if fetchStatus == "sucess"{
let billerDetails = json["response"] as! [String:Any]
let value = billerDetails["billerResponse"] as! String
print(value)
let res = try JSONSerialization.jsonObject(with:Data(value.utf8)) as! [String: Any]
self.billerName = res["billerName"] as? String
var consumName = res["customerName"] as? String
print("fetch only APEPDCL biller name \(self.billerName)")
DispatchQueue.main.async {
let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "FetchBillerViewController") as? FetchBillerViewController
nextViewController?.nameText = self.billerName
nextViewController?.consumrName = consumName
self.navigationController?.pushViewController(nextViewController!, animated: true)
}
}
else{
DispatchQueue.main.async {
AlertFun.ShowAlert(title: "", message: "Invalid service Number", in: self)
}
}
}catch{
print("error")
}
}
}).resume()
}
}
在您的视图控制器中声明一个变量来存储最终值。
var finalSearchValue : String = ""
现在在你的 cellForRowAtIndexPath 方法中添加这一行:
cell.searchFieldText.addTarget(self, action: #selector(searchEditingChanged(textField:)), for: .editingChanged)
现在在你的视图控制器中声明这个函数:
@objc func searchEditingChanged(textField: UITextField) {
finalSearchValue = textField.text!
}
就是这样。您的 finalSearchValue 变量现在包含输入文本。将它用于您的 api 请求。
如果有任何问题,请告诉我。
最初我从之前的 viewcontroller 获取文本字段文本,以了解要在当前视图控制器中添加哪些文本。如果我点击文本字段,以前的文本将是空的,我正在添加文本,但我无法添加当前视图控制器 post 参数的文本。这里我也得到以前的视图控制器文本。
这是我的代码:
@IBOutlet weak var tableView: UITableView!
var cell : BillerTableViewCell?
var textFieldArray = [String]()
var selectedBiller: JsonDataBiller?
var toplabeText: String?
var textFieldValue: String?
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
cell = tableView.dequeueReusableCell(withIdentifier: "textfieldCell", for: indexPath) as! BillerTableViewCell
cell?.searchTextfield.delegate = self
if let param = selectedBiller?.bcustomerparms[indexPath.row] {
cell?.searchTextfield.text = param.paramName
textFieldValue = cell?.searchTextfield.text
} else {
cell?.searchTextfield.text = "missing data"
}
return cell!
}
func textFieldDidBeginEditing(_ textField: UITextField) {
textField.text = ""
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
@objc func buttonClicked(sender: UIButton) {
billerFetchService()
}
func billerFetchService(){
print("fetch paramname \(textFieldKey)")
// var textFieldValue: String = (cell?.searchTextfield.text)!
let parameters = ["billDetails": [
"billerId" : "EPDCLOB00ANP01",
"customerParams" : [["name": textFieldKey,"value": textFieldValue]]]] as [String : Any]
print("the textfield value is \(textFieldValue)")
let url = URL(string: "https://app.com/emi_v1/fetch")
var req = URLRequest(url: url!)
req.httpMethod = "POST"
req.addValue("application/json", forHTTPHeaderField: "Contet-Type")
req.addValue("application/json", forHTTPHeaderField: "Accept")
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) else {return}
req.httpBody = httpBody
let session = URLSession.shared
session.dataTask(with: req, completionHandler: {(data, response, error) in
if response != nil {
// print(response)
}
if let data = data {
do{
var json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
// print("fetching json \(json)")
let fetchStatus = json["status"] as? String
if fetchStatus == "sucess"{
let billerDetails = json["response"] as! [String:Any]
let value = billerDetails["billerResponse"] as! String
print(value)
let res = try JSONSerialization.jsonObject(with:Data(value.utf8)) as! [String: Any]
self.billerName = res["billerName"] as? String
var consumName = res["customerName"] as? String
print("fetch only APEPDCL biller name \(self.billerName)")
DispatchQueue.main.async {
let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "FetchBillerViewController") as? FetchBillerViewController
nextViewController?.nameText = self.billerName
nextViewController?.consumrName = consumName
self.navigationController?.pushViewController(nextViewController!, animated: true)
}
}
else{
DispatchQueue.main.async {
AlertFun.ShowAlert(title: "", message: "Invalid service Number", in: self)
}
}
}catch{
print("error")
}
}
}).resume()
}
}
在您的视图控制器中声明一个变量来存储最终值。
var finalSearchValue : String = ""
现在在你的 cellForRowAtIndexPath 方法中添加这一行:
cell.searchFieldText.addTarget(self, action: #selector(searchEditingChanged(textField:)), for: .editingChanged)
现在在你的视图控制器中声明这个函数:
@objc func searchEditingChanged(textField: UITextField) {
finalSearchValue = textField.text!
}
就是这样。您的 finalSearchValue 变量现在包含输入文本。将它用于您的 api 请求。
如果有任何问题,请告诉我。