iT邦幫忙

0

ios textfield 如何把值傳給多個view controller使用

各位先進大哥好,小弟目前撰寫了一支簡單的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
還請各位高手指點迷津!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2019-03-29 09:50:11
最佳解答

我實在看不懂問題在那裡
(可以傳 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
    }
}

https://ithelp.ithome.com.tw/upload/images/20190329/20115582ob96UMKGhX.png
這是功能的示意圖,IP輸入完,下面的帳號密碼就要驗證那組IP 的API 的資料

新的問題我解決了,我自己在textfield加了一個監控,然後配合gatlastsUSER()就登入成功了,感謝你先前的回覆!!

解決就好
週末愉快
/images/emoticon/emoticon75.gif

我要發表回答

立即登入回答