Как я могу заставить эту кнопку программно открывать новый навигационный контроллер? - PullRequest
0 голосов
/ 24 июня 2018

Как я могу заставить эту кнопку открыть новый навигационный контроллер? Я хочу, чтобы он принудительно открыл новый контроллер справа.

Мне нужно сделать все это программно, не используя раскадровку.

@objc func buttonAction(sender: UIButton!) {
    let loginDetailController = UIViewController()
    navigationController?.pushViewController(loginDetailController, animated: true)
    print("Button tapped")
}

Вот код, который делает редактируемый контроллер представления всплывающим, когда пользователь не вошел в систему. Этот код находится в контроллере rootview.

func checkIfUserIsLoggedIn() {
    if Auth.auth().currentUser?.uid == nil {
        perform(#selector(handleLogout), with: nil,
                        afterDelay: 0)
    }else{
        let uid = Auth.auth().currentUser?.uid
        Database.database().reference().child("users").child(uid!).observeSingleEvent(of: .value, with: {(snapshot) in

            if let dictionary = snapshot.value as? [String: AnyObject] {
                self.navigationItem.title = dictionary["name"] as? String
                self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
                self.navigationController?.navigationBar.prefersLargeTitles = true
                self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]



            }

            },withCancel: nil)

    }

}
override func didMove(toParentViewController parent: UIViewController?) {
    checkIfUserIsLoggedIn()
}

@objc func handleLogout() {

    do {
        try Auth.auth().signOut()
    } catch let logoutError {
        print(logoutError)
    }
    let loginController  = TwoLoginController()
    present(loginController, animated: true, completion:
    nil)
}

}

Здесь я добавил отклонение навигационного контроллера.

func handleLogin() {
    guard let email = emailTextField.text, let password = passwordTextField.text else{
        print("invalid form")
        return
    }
    Auth.auth().signIn(withEmail: email, password: password) { (user, error) in

        if error != nil {
            print(error!)
            return
        }
        //logged in
        self.dismiss(animated: true, completion: nil)
        self.navigationController?.dismiss(animated: true, completion: nil)
    }

}

Новый подход?

import UIKit
import Firebase

class TwoLoginController: UINavigationController {

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

После обсуждения и получения большей картины. Вот как вы должны программно представить ViewController внутри нового NavigationController

@objc func handleLogout() {

    do {
        try Auth.auth().signOut()
    } catch let logoutError {
        print(logoutError)
    }
    let loginController  = TwoLoginController()
    let navVC = UINavigationController(rootViewController: loginController)
    present(navVC, animated: true, completion: nil)
}

Тогда для уничтожения контроллера навигации в конце должно быть что-то вроде этого:

self.navigationController?.dismiss(animated: true) {
     // 
}

Сделайте это, когда вход в систему будет завершен, когда вам нужно перейти к следующему представлению.

0 голосов
/ 24 июня 2018

С раскадровками

Сначала создайте новый файл, представляющий собой пользовательский класс viewController.Для этого примера мы назовем его YourCustomViewController.Затем (перейдите к вашей раскадровке и добавьте новый viewController в раскадровку. Выберите этот ViewController, присвойте ему идентификатор и задайте его класс. После этого вставьте в вашу функцию следующий код:

let controller = self.storyboard!.instantiateViewController(withIdentifier: "Your View's Identifier") as! YourCustomViewController
self.navigationController!.pushViewController(controller, animated: true)

Без раскадровок:

В вашем AppDelegate

// put the following code in your appDelegate didFinishLaunchingWithOptions function
window?.rootViewController = UINavigationController(rootViewController: HomeController(collectionViewLayout: layout))

UINavigationBar.appearance().barTintColor = UIColor.rgb(230, green: 32, blue: 31)

 // get rid of black bar underneath navbar
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)

application.statusBarStyle = .lightContent

let statusBarBackgroundView = UIView()
statusBarBackgroundView.backgroundColor = UIColor.rgb(194, green: 31, blue: 31)

window?.addSubview(statusBarBackgroundView)
window?.addConstraintsWithFormat("H:|[v0]|", views: statusBarBackgroundView)
window?.addConstraintsWithFormat("V:|[v0(20)]", views: statusBarBackgroundView)

В вашем действии для представления представления

// this code belongs in your button's action
let dummyViewController = UIViewController()
dummyViewController.view.backgroundColor = .white
dummyViewController.navigationItem.title = "TEST"
navigationController?.navigationBar.tintColor = .white
navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
navigationController?.pushViewController(dummyViewController, animated: true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...