我有一个带有按钮的主视图控制器允许用户“登录”按下按钮后,它会加载一个处理登录的不同视图。我的登录视图控制器处理所有检查并查询我的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"
}
}
答案 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
}
}