У меня проблема с запуском метода в одном контроллере из другого.Я настраиваю все свои элементы (кнопки, виды ..) программно и тоже использую NavigationController
.
Я хочу запускать метод fetchUsers()
всякий раз, когда новый пользователь входит в систему или регистрируется так, чтобыtableView перезагружает свои ячейки со всеми пользователями, в настоящее время заполняющими Firebase.
Проблема в том, что метод fetchUsersDelegate?.fetchUsers()
никогда не вызывается, потому что loginController.fetchUsersDelegate = self
никогда не устанавливается в self и всегда остается нулевым.
Такмой вопрос, как я должен правильно установить fetchUsersDelegate
?
Первый класс
class LoginController: UIViewController {
var fetchUsersDelegate: FetchUsersDelegate?
lazy var loginRegisterButton: UIButton = {
let button = UIButton()
button.backgroundColor = UIColor(r: 80, g: 101, b: 161)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Register", for: .normal)
button.setTitleColor(UIColor.white, for: .normal)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
button.layer.cornerRadius = 25
button.layer.masksToBounds = true
button.addTarget(self, action: #selector(handleLoginRegister), for: .touchUpInside)
return button
}()
@objc func handleLoginRegister(){
if loginRegisterSegmentedControl.selectedSegmentIndex == 0 {
handleLogin()
} else {
handleRegister()
}
}
func handleLogin() {
guard let email = emailTextField.text, let password = passwordTextField.text else {
print("Registration form is not valid")
return
}
Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
if error != nil {
print(error!)
return
}
print("Sucessfully logged in")
self.dismiss(animated: true, completion: nil)
}
self.fetchUsersDelegate?.fetchUsers()
}
Второй класс
class UsersController: UITableViewController, FetchUsersDelegate{
let cellID = "cellID"
var users = [User]()
let loginController = LoginController()
override func viewDidLoad() {
super.viewDidLoad()
loginController.fetchUsersDelegate = self
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Logout", style: .plain, target: self, action: #selector(handleLogout))
checkIfUserIsLoggedIn()
}
func fetchUsers(){
Database.database().reference().child("users").observe(.childAdded, with: { (DataSnapshot) in
if let dictionary = DataSnapshot.value as? [String: AnyObject]{
let user = User()
user.name = dictionary["name"] as? String
user.email = dictionary["email"] as? String
self.users.append(user)
// if we call just tableView.reloadData the app will crash, insead we need to call it inside
// DispatchQueue.main.async
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}, withCancel: nil)
}
Протокол
protocol FetchUsersDelegate {
func fetchUsers()
}
* Редактировать:
Так я настраивал свой rootViewController в классе AppDelegate
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
window?.rootViewController = UINavigationController(rootViewController: UsersController())
return true
}
И этоВот как я представляю LoginController, метод handleLogout () находится внутри UsersController, если это помогает.
@objc func handleLogout(){
do{
try Auth.auth().signOut()
} catch let logoutError{
print(logoutError)
}
let loginController = LoginController()
present(loginController, animated: true, completion: nil)
}