【发布时间】: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