各位先進大哥好,小弟目前撰寫了一支簡單的APP (抓json資料顯示出來)
目前遇到一個問題,我的每個controller裡都有不同的api url
格式是“http://IP位址/api/不同資料夾名稱”
我的設計是登入介面要輸入一組web api 的ip 然後ip傳到各個controller做使用
目前的做法是用登入的view controller 拉一個 segue到某個viewcontroller中,目前的做法已經成功將登入畫面textfield的值傳到別的contrller內,但是下一步就不知道怎麼做了,不管怎麼嘗試,都只能一對一傳輸,無法將值傳給多個controller做使用
目前登入介面的swift code如下
import UIKit
class testIPsetViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
navigationController?.isNavigationBarHidden = true
}
override func viewDidDisappear(_ animated: Bool) {
navigationController?.isNavigationBarHidden = true
}
@IBOutlet weak var inputTextfield: UITextField!
@IBAction func btnSend(_ sender: UIButton) {
if inputTextfield.text == "" {
let alert = UIAlertController(title: "欄位請勿為空", message: "請重新輸入", preferredStyle: .alert)
let ok = UIAlertAction(title: "好", style: .default, handler: nil)
alert.addAction(ok)
present(alert, animated: true, completion: nil)
} else {
self.performSegue(withIdentifier: "Send", sender: nil)
//self.performSegue(withIdentifier: "Send2", sender: nil)
inputTextfield.text = ""
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "Send" {
let secondVC = segue.destination as! testloginViewController
secondVC.recevieText = inputTextfield.text!
}
// else if segue.identifier == "Send2" {
// let secondVC = segue.destination as! KivaLoanTableViewController
// secondVC.recevieText = inputTextfield.text!
//
// }
//
}
}
註解的部分是我嘗試傳送給多個contrller加上去的,但是都失敗
以下是我接收登入介面textfield的 controller的程式碼
var receivedText: String = ""
guard let userUrl = URL(string: "http://" + recevieText + "/api/USER" ) else{
return
}
僅貼上接收字串部分的code
不管怎麼做都只有辦法將值傳送給 identifier:Send的controller
還請各位高手指點迷津!
我實在看不懂問題在那裡
(可以傳 inputTextfield 的話,IP 應該可以比照辦理了?)
提供另一個省時又簡單的做法,全域變數
看看合不合用
Global Variable
可能我的問題敘述怪怪的,就是我有實作一個登入頁面,頁面內有一個textfield與button,我想透過登入頁面的textfield輸入IP之後,這串IP給底下所有有抓api讀資料的controller用。
如果用Global Variable,他是宣告在class之外,那我該怎麼讓他存我的登入頁面textfield的資料呢?
//----------- 登入頁面
var gIP = ""
class testIPsetViewController: UIViewController {
@IBAction func btnSend(_ sender: UIButton) {
gIP = inputIPfield.text!
}
}
//----------- xxx Controller
class xxxViewController: UIViewController {
var receivedText: String = ""
override func viewDidLoad() {
super.viewDidLoad()
receivedText = gIP
...
}
}
真的非常感謝你的解答!豁然開朗!
但小弟愚鈍...雖然此問題已解決,但又碰見新問題
我的首頁改成三個textfield,第一個輸入IP,第二個輸入帳號,第三個輸入密碼,變成我在這個頁面自己就要驗證自己的IP,因為輸入完IP之後才抓得到帳號密碼的資料庫!
目前大概知道自己錯誤在哪、我IP輸入之後,url才會更新成我要的,所以我在UIBUTTON裡面再getlatestUSER()一次,按下BUTTON後,會出現一次驗證錯誤,再按一次就會登入成功,不知道是什麼問題,麻煩你再給我一些方向了
import UIKit
var APIip = ""
class SQLloginViewController: UIViewController {
private var users = [USER]()
@IBOutlet weak var ip: UITextField!
@IBOutlet weak var usercount: UITextField!
@IBOutlet weak var userpassword: UITextField!
@IBOutlet weak var SQLlogin: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
getlatestUSER()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
override func viewWillAppear(_ animated: Bool) {
navigationController?.isNavigationBarHidden = true
}
override func viewDidDisappear(_ animated: Bool) {
navigationController?.isNavigationBarHidden = true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func SQLlogin(_ sender: UIButton) {
APIip = ip.text!
getlatestUSER()
if users.contains(where: {$0.ID == usercount.text && $0.Password == userpassword.text}) {
}
else if usercount.text == "" || userpassword.text == "" {
let alert = UIAlertController(title: "欄位請勿為空", message: "請重新輸入", preferredStyle: .alert)
let ok = UIAlertAction(title: "好", style: .default, handler: nil)
alert.addAction(ok)
present(alert, animated: true, completion: nil)
}
else {
let alert = UIAlertController(title: "連線失敗", message: "請重新輸入", preferredStyle: .alert)
let ok = UIAlertAction(title: "好", style: .default, handler: nil)
alert.addAction(ok)
present(alert, animated: true, completion: nil)
}
}
@objc func getlatestUSER(){
guard let userUrl = URL(string: "http://" + ip.text! + "/api/USER" ) else{
return
}
let request = URLRequest(url: userUrl)
let task = URLSession.shared.dataTask(with: request, completionHandler: {(data,response,error) -> Void in
if let error = error {
print(error)
return
}
if let data = data {
self.users = self.pardrJsonData(data: data)//轉換給定的JSON格式資料 作為USER物件的陣列
}
})
task.resume()
}
func pardrJsonData(data: Data) -> [USER]{ //讀取json資料,存USER>丟給users做使用
var users = [USER]()
do {
let jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
//JSONSerialization 類別轉JSON data 結果存 jsonResult
//解析 json data
let jsonUSERs = jsonResult?["USER"] as! [AnyObject] // 驗證此陣列是否有值
for jsonUSER in jsonUSERs{
var user = USER()
user.ID = jsonUSER["ID"] as! String
user.Password = jsonUSER["Password"] as! String
users.append(user)
} }catch{
print(error)
}
return users
}
}
這是功能的示意圖,IP輸入完,下面的帳號密碼就要驗證那組IP 的API 的資料
新的問題我解決了,我自己在textfield加了一個監控,然後配合gatlastsUSER()就登入成功了,感謝你先前的回覆!!
解決就好
週末愉快