2016-11-01 4 views
0

У меня есть контроллер главного представления с кнопкой, позволяющий пользователю «войти». Когда они нажимают кнопку, он загружает другое представление, которое обрабатывает вход в систему. контроллер входа в систему обрабатывает все проверки и запросы моей базы данных 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

Хм, я вижу .. плохо дайте ему шанс ... любые примеры были бы весьма благодарны. – Eseye

ответ

0

В случае, если нужно "отправить" информацию для конкретного получателя (MainViewController), как советовали выше, вы можете использовать делегат или закрывающих механизмов (иначе может быть использован механизм уведомления). Ниже приведена иллюстрация закрытия.

Обратите внимание на строку «lvc.action = {() in print (self)}» в этой строке закрытие гарантирует, что ссылка на self переносится на LoginVC, поэтому, несмотря на то, что код запущен в LoginVC, результат печати является MainVC. Надеюсь, это поможет.

Код, вероятно, не оптимален, но показывает точку. Это полная иллюстрация (Xcode 8.1 (8B62)): Удалить раскадровки, launchscreen, Чистые свойства Главной раскадровку и Launchscreen в 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 
    } 
} 
+0

Благодарим вас за ответ. Я проверю это. Они кажутся безумно сложными по сравнению с PHP, только начинающим сеанс. Я должен верить, что есть лучший способ, чем это. Должно быть что-то, чтобы передавать пользовательские данные из одного представления в другое, основываясь на простом bool, чтобы проверить, зарегистрирован ли пользователь или нет. Я не могу себе представить, что это самое простое решение. – Eseye

Смежные вопросы

 Смежные вопросы