用户登录其他视图控制器后,刷新主视图控制器

时间:2016-11-01 17:16:36

标签: swift xcode macos login nsuserdefaults

我有一个带有按钮的主视图控制器允许用户“登录”按下按钮后,它会加载一个处理登录的不同视图。我的登录视图控制器处理所有检查并查询我的mysql数据库确保用户存在且有效。一旦用户有效,我如何刷新我的主视图控制器而不是已经加载,以便它收集我的用户信息。例如,我现在不想让我的主控制器上的“登录”按钮说“登录”,而是希望它能说出他们的电子邮件。我没有问题传递此信息,但如何刷新我的主视图控制器,以便它现在知道用户已从另一个视图控制器登录。

LoginViewController

if(resultValue == "Success"){

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

}

MainViewController

override func viewWillAppear() {

    super.viewWillAppear()

    let isloggedin = UserDefaults.standard.bool(forKey: "isLoggedIn")

    if (isloggedin == true){

        SignInButton.title = "Email"


    }else{

        SignInButton.title = "Sign In"
    }
}

1 个答案:

答案 0 :(得分:0)

如果您需要按照上面的建议将信息“发送”给特定的收件人(MainViewController),您可以使用委托或关闭机制(否则可以使用通知机制)。请在下面找到封闭图。

注意该行闭包中的“lvc.action = {()in print(self)}”行确保对self的引用传递给LoginVC,所以尽管代码在LoginVC中运行,但打印结果是MainVC。希望有所帮助。

代码可能不是最佳的,但显示了重点。它是(Xcode 8.1(8B62))的完整说明:在Info.plist中删除故事板,启动屏幕,清除属性主故事板和启动屏幕,并将AppDelegate.swift替换为以下内容

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window!.rootViewController = MainViewController()
        self.window!.makeKeyAndVisible()
        return true
    }
}

class LoginViewController: UIViewController {
    var action: (()->())!
    override func viewDidLoad() {
        super.viewDidLoad()
        let b = self.view.addSubviewWithConstraints(["b" : Button(title: "Validate user")], constraints: ["V:|-10-[b(70)]", "H:|-10-[b]-10-|"])["b"]
        (b as! Button).action = self.action

    }
}

class MainViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let b = self.view.addSubviewWithConstraints(["b" : Button(title: "Log in")], constraints: ["V:|-10-[b(70)]", "H:|-10-[b]-10-|"])["b"]
        (b as! Button).action = {
            let lvc = LoginViewController()
            lvc.action = {() in print(self)}
            self.present(lvc, animated: false,completion: nil)
        }
    }
}

class Button: UIButton {
    var action: (()->())!
    init(title: String) {
        super.init(frame : CGRect.zero)
        self.setTitle(title, for: UIControlState())
        self.addTarget(self, action: #selector(Button.buttonAction(_:)), for: .touchUpInside)
    }
    required init?(coder: NSCoder) {super.init(coder: coder)}
    func buttonAction(_ sender: AnyObject) {if action != nil {action()}}
}

extension UIView {
    func addSubviewWithConstraints(_ views: [String : AnyObject], constraints: Array<String>) -> [String : AnyObject] {
        for (_, view) in views {
            self.addSubview(view as! UIView)
            (view as! UIView).translatesAutoresizingMaskIntoConstraints = false
        }
        for i in 0 ..< constraints.count {self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: constraints[i], options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views))}
        return views
    }
}
相关问题