2016-11-01 13 views
0

ボタンを持つメインView Controllerを使用して、「Sign In」ボタンを押すと、ログインを処理する別のビューがロードされます。ログインビューコントローラは、すべてのチェックを処理し、mysqlデータベースにユーザが存在し、有効であることを確認します。ユーザーが有効になると、既に読み込まれているよりもメインビューコントローラーをリフレッシュしてユーザー情報を収集する方法を教えてください。たとえば、私のメインコントローラに「サインイン」ボタンを表示させる代わりに、「サインイン」と言うと、今は自分の電子メールを伝えたいと思う。この情報を渡すのに問題はありませんが、メインビューコントローラを更新して、ユーザーが別のビューコントローラからログインしたことを知るようにするにはどうすればよいですか。ユーザーが別のView Controllerにログインした後、Main View Controllerをリフレッシュする

あなたは(代理人または閉鎖メカニズムを使用することができます上記のアドバイスとして、特定の受信者(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

火災通知/デリゲートでAppDelegate.swiftをInfo.plistファイルにストーリーボード、launchscreen、クリーンプロパティメインストーリーボードとLaunchscreenを削除して置換しますメインのコントローラにすでにログイン情報が表示され、この画面がレンダリングされたときにログイン情報に基づいて情報がロードされます。 –

+0

うーん、私はそれを見ました。 – Eseye

答えて

0

LoginViewController

if(resultValue == "Success"){ 

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

} 

MainViewControllerそれ以外の場合は通知メカニズムを使用できます)。閉鎖の図解を以下で見つけてください。

そのラインクロージャで "lvc.action = {(in print(self)}"という行がLoginVCに転送されるので、コードがLoginVCで実行されているにもかかわらず、印刷結果MainVCです。希望が役立ちます。

コードはおそらく最適ではありませんが、その点が示されています。これは、(Xcodeの8.1(8B62))のための完全な実例である:以下の内容

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 
    } 
} 
+0

ありがとうございました。私はそれをテストします。これらは、ちょうどセッションを開始するPHPに比べて非常に複雑すぎるようです。私はこれより良い方法があると信じなければなりません。ユーザーがログインしているかどうかを確認する簡単なブールに基づいて、ユーザーデータをあるビューから別のビューに共有する必要があります。私はこれが最も簡単な解決策であるとは想像もできません。 – Eseye

関連する問題