【问题标题】:User input as global variable to display text from different views用户输入作为全局变量以显示来自不同视图的文本
【发布时间】:2016-10-31 18:49:09
【问题描述】:

如果用户未登录,我有一个主视图控制器,而不是“登录”按钮。然后我有另一个视图控制器“登录视图控制器”检查用户是否存在然后登录。一旦用户已通过登录视图控制器登录。我希望我的主视图控制器上的登录按钮的文本更改为他们用来登录的电子邮件。我正在使用结构来尝试完成此操作。我的 struct email 变量似乎在我的登录视图控制器中工作,但不会更改主视图控制器上按钮的字符串值。任何帮助将不胜感激。

LoginViewController.swift

class LoginViewController: NSViewController {

@IBOutlet weak var userEmailTextField: NSTextField!


struct GloablUserEmail {

    static var user_status = Bool()
    static var user_email  = String()

}

@IBAction func LoginPushed(_ sender: AnyObject) {

    GloablUserEmail.user_email = userEmailTextField.stringValue

let requestURL: NSURL = NSURL(string: "myurl")!

    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(url: requestURL as URL)
    urlRequest.httpMethod = "POST"

    let postString = "user_email=\(GloablUserEmail.user_email)&user_password=\(user_password)"
    urlRequest.httpBody = postString.data(using: String.Encoding.utf8);

    let session = URLSession.shared
    let task = session.dataTask(with: urlRequest as URLRequest) {
        (data, response, error) -> Void in

        let httpResponse = response as! HTTPURLResponse
        let statusCode = httpResponse.statusCode

        if (statusCode == 200) {

            do{

                let json = try JSONSerialization.jsonObject(with: data!, options:.mutableContainers) as? NSDictionary

                if let parseJSON = json {

                    let resultValue = parseJSON["Status"] as? String
                    print("result: \(resultValue)")

                    self.isUserRegistered = false

                    if(resultValue=="Success"){

                        GloablUserEmail.user_status = true;

                        UserDefaults.standard.set(true, forKey: "isUserLoggedIn");
                        UserDefaults.standard.synchronize();

                    }
                }

            }catch{

                print("Error parsing the JSON: \(error)")

            }
        }
    }


    task.resume()
    }
}   

一旦结果成功并且验证用户存在,然后我将全局 user_status 分配为 true。

MainViewController.swift

class ViewController: NSViewController {

@IBOutlet weak var SignInButton: NSButton!

override func viewDidLoad() {

    super.viewDidLoad()

    if(LoginViewController.GloablUserEmail.user_status == false){

        SignInButton.title = "Sign In"

    }else if(LoginViewController.GloablUserEmail.user_status == true){

        SignInButton.title = LoginViewController.GloablUserEmail.user_email
    }


}
}

【问题讨论】:

  • 全球化让小猫哭泣。
  • 有没有不让小猫哭泣的替代品?
  • 是的,有一个良好的架构设计,包括一个合理的视图控制器图表,以一种理智的方式进行通信。不幸的是,这并不总是简单的,也并不总是容易解释的。关于软件设计的整本书都涵盖了这一点。您使用全局变量作为跨视图控制器传达信息的一种狡猾的方式。在没有全局变量作为中介的情况下,视图控制器没有理由不能直接通信

标签: swift macos global-variables swift3 user-input


【解决方案1】:

您可以使用一个简单的 UserDefaults 扩展:

extension UserDefaults{

    var isLoggedIn: Bool{
        return bool(forKey: "loggedIn")
    }

    func set(loggedIn value: Bool){
        set(value, forKey: "loggedIn")
        synchronize()
    }
}

设置登录状态:

 let defaults = UserDefaults.standard
 defaults.set(loggedIn: true)

并检查它的值:

 let defaults = UserDefaults.standard
 defaults.isLoggedIn

【讨论】:

  • 我明白你在说什么,但无论使用此代码检查状态,我仍然需要将用户电子邮件从一个视图传递到另一个视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2020-11-25
  • 2020-10-01
相关资源
最近更新 更多