Как перейти от UITabBarController к ViewController? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть TabBarController внутри. Я загружаю два ViewControllers.

import UIKit

class TabBarViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

Изображения:

enter image description here

class AttendanceViewController: UIViewController,UIApplicationDelegate,
    UICollectionViewDelegateFlowLayout,UINavigationControllerDelegate,
    CLLocationManagerDelegate,UIImagePickerControllerDelegate {

    override func viewWillAppear(_ animated: Bool) {
    if  Auth.auth().currentUser?.uid == nil {
        //Below code is not working
        let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main)
        .instantiateViewController(withIdentifier: "LoginViewController") as? LoginViewController
        self.navigationController?.pushViewController(vc!, animated: true)
        print("user is not login in redirect to login page")
        return
    }else{
        print("User Successfully loginedin")
    }
}

}

Примечание: У меня есть два контроллера вида, таких как AttendanceViewController и TaskViewController Я хочу проверить, не является ли пользователь логиномЗатем я хочу перенаправить на мой LoginViewController Я пробовал выше код, он не работал

Ответы [ 4 ]

0 голосов
/ 27 ноября 2018

Эй, я только что создал пример, он поможет вам: -

Я просто использую userdefaults, чтобы сохранить loginState

Вот: -

1).TaskViewController

Я только что создал кнопку signOut

import UIKit

class TaskViewController: UIViewController {


@IBOutlet weak var signOutButton: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func viewDidLayoutSubviews() {
    signOutButton.layer.cornerRadius = signOutButton.layer.frame.height/2
}



@IBAction func signOutButtonTapped(_ sender: Any) {

    UserDefaults.standard.set(false, forKey: "isUserLoggedIn")  // here I remove the boolean value
    UserDefaults.standard.synchronize()
    let storyBoard = UIStoryboard(name: "Login", bundle: nil)
    let loginVc = storyBoard.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
    let rootVc = UINavigationController(rootViewController: loginVc)
    UIApplication.shared.keyWindow?.rootViewController = rootVc

}



}

2).AttendanceViewController - я ничего не создал в нем

import UIKit

class AttendanceViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}


}

Оба этих контроллера находятся внутри TabBarController, то есть HomeController

import UIKit

class HomeController: UITabBarController {

override func viewDidLoad() {
    super.viewDidLoad()


}

}

Я создал его в Main.storyboard файл: - enter image description here

И LoginViewController, созданный в login.storyboard файл enter image description here

LoginViewController: - здесь сохранено loginState

import UIKit

class LoginViewController: UIViewController {

@IBOutlet weak var loginButton: UIButton!


override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func viewDidLayoutSubviews() {
    loginButton.layer.cornerRadius = loginButton.layer.frame.height/2
}


@IBAction func loginButtonTapped(_ sender: Any) {

    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let viewController = mainStoryboard.instantiateViewController(withIdentifier: "HomeController") as! HomeController
    UserDefaults.standard.set(true, forKey: "isUserLoggedIn")
    UserDefaults.standard.synchronize()
    UIApplication.shared.keyWindow?.rootViewController = viewController

}

}

И последний в Appdelegate.swift проверьте loginState в didFinishLaunchingWithOptions следующим образом: -

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let userLoginStatus = UserDefaults.standard.bool(forKey: "isUserLoggedIn")
    print(userLoginStatus)

    if(userLoginStatus)
    {
        let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
        let centerVC = mainStoryBoard.instantiateViewController(withIdentifier: "HomeController") as! HomeController
        window!.rootViewController = centerVC
        window!.makeKeyAndVisible()
    } else {

        let mainStoryBoard = UIStoryboard(name: "Login", bundle: nil)
        let centerVC = mainStoryBoard.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
        window!.rootViewController = centerVC
        window!.makeKeyAndVisible()
    }

    return true
}

Вот полный проект - https://www.dropbox.com/s/3d34raovyx6orda/saveLogin.zip?dl=0

0 голосов
/ 27 ноября 2018

Я думаю, вы хотите проверить это в appDelegate.В настоящее время я также работаю с UITabbarcontroller. Я предлагаю установить тег (используя userDefaults) для проверки того, входит ли пользователь в систему или нет.И мой код

class AppDelegate: UIResponder, UIApplicationDelegate , UITabBarControllerDelegate , GIDSignInDelegate{

    var window: UIWindow?

    var userCurrentLocation : CLLocation?
    var mapView : GMSMapView?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        if UserDefaults.standard.value(forKey: "LoginStatus")as? String == "1"
        {
            let storyBoard = UIStoryboard(name: "Main", bundle: nil)
            let initailVC = storyBoard.instantiateViewController(withIdentifier: "tabBar")
            let navVC = UINavigationController(rootViewController: initailVC)
            self.window?.rootViewController = navVC
        }

        return true
    }

Я использую этот код, чтобы проверить, входит ли пользователь в систему, он будет перенаправлен на TabBarController, а если нет, он останется в LoginVC.

0 голосов
/ 27 ноября 2018
  • Вставьте UITabBarController в UINavigationController

    UINavigationController(rootViewController: UITabBarController(nibName: "TabBarNibName", bundle: Bundle.main))

  • Просто нажмите с контроллера навигации вашего TabBarController

    tabbarcontroller.navigationController?.pushViewController(vc!, animated: true)

0 голосов
/ 27 ноября 2018

Присутствует UIViewController

Код, который вы написали, работал бы, если бы ваши ViewController были встроены в UINavigationController, а это не так.Таким образом, вместо того, чтобы нажимать UIViewController из UINavigationController, который не существует, вы можете просто представить свой LoginViewController.Поэтому замените это:

let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main)
.instantiateViewController(withIdentifier: "LoginViewController") as? LoginViewController
self.navigationController?.pushViewController(vc!, animated: true)

на

let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main)
.instantiateViewController(withIdentifier: "LoginViewController") as? LoginViewController
present(vc!, animated: true, completion: nil)  

Встроить в UINavigationController

В качестве альтернативы вы можете встроить UIViewController в UINavigationControllerи установите переход с идентификатором, а затем выполните этот переход на LoginViewController.

enter image description here

enter image description here

enter image description here

7.Выполните segue

performSegue(withIdentifier: "YourIdentifier", sender: self)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...