userId, приходящий в appdelegate, по-прежнему не собирается в Mainviewcontroller, почему? быстро

NavigationController - это isinitial viewcontroller in storyboard, NavigationController встроен в LoginViewcontroller.

в раскадровке проекта навигация будет выглядеть, как показано ниже

NavigationController->LoginViewcontroller-> RegistrationViewcontroller -> MainViewcontroller

при успешной регистрации в PhNUmber я получаю userId, который я сохранил в KeychainWrapper

в RegistrationViewcontroller: я сохраняю userId, как показано ниже:

 let userID: String=jsonObj?["userId"] as? String ?? "" 
 KeychainWrapper.standard.set(userID, forKey: "USERID")

который я проверяю в appdelegate, как показано ниже, чтобы перейти в Mainviewcontroller:

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
var savedUserId: String?

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

    savedUserId = KeychainWrapper.standard.string(forKey: "USERID")
    print("appdelegate userid \(savedUserId)")
    if savedUserId != nil{
        print("saveuserid \(savedUserId)")
        let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
        window?.rootViewController = mainStoryBoard.instantiateViewController(withIdentifier: "MainViewController")
    }
    return true
}
}

вот savedUserId тогда, почему я не собираюсь использовать MainViewcontroller, все время появляется LoginViewcontroller


person iOSApp    schedule 05.06.2020    source источник


Ответы (3)


Вам необходимо инициализировать window. Дайте этой строке выше установку rootViewController:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var savedUserId: String?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        savedUserId = KeychainWrapper.standard.string(forKey: "USERID")
        print("appdelegate userid \(savedUserId)")
        if savedUserId != nil{
            print("saveuserid \(savedUserId)")
            let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
            window = UIWindow()
            window?.rootViewController = mainStoryBoard.instantiateViewController(withIdentifier: "MainViewController")
        }
        return true
    }
}

Обновление: если вы используете SceneDelegate, вы должны использовать это:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = scene as? UIWindowScene else { return }
        window = UIWindow(windowScene: windowScene)print("appdelegate userid \(savedUserId)")
        if savedUserId != nil{
            print("saveuserid \(savedUserId)")
            let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
            window = UIWindow()
            window?.rootViewController = mainStoryBoard.instantiateViewController(withIdentifier: "MainViewController")
        }
    }
}
person Frankenstein    schedule 05.06.2020
comment
если я даю это var window = UIWindow(), тогда ошибка: тип «окна» имеет другую необязательность, чем требуется протоколом «UIApplicationDelegate» - person iOSApp; 05.06.2020
comment
var window: UIWindow? и в didFinishLaunchingWithOptions в окне window = UIWindow ()? .rootViewController = mainStoryBoard.instantiateViewController (withIdentifier: MainViewController) ............ тогда также появляется контроллер просмотра входа - person iOSApp; 05.06.2020
comment
Я сомневаюсь, что вы даете ответ так, как я ожидал. Итак, я обновил свой ответ на весь предоставленный вами код. - person Frankenstein; 05.06.2020
comment
оба идентификатора пользователя прибывают appdelegate идентификатор пользователя Необязательно (415c6073d45a481f991cb81b4c81bf81) saveuserid Необязательно (415c6073d45a481f991cb81b4c81bf81). но идет логинвьюконтроллер - person iOSApp; 05.06.2020
comment
Не могли бы вы проверить, получает ли mainStoryBoard.instantiateViewController(withIdentifier: "MainViewController") != nil true. - person Frankenstein; 05.06.2020
comment
@iOSApp Если вы используете SceneDelegate, вам следует использовать только что опубликованное мной обновление. - person Frankenstein; 05.06.2020
comment
Файл SceneDelegate есть, но я не использую .. Я использую только appdelegate - person iOSApp; 05.06.2020
comment
Это не в счет. Если вы не используете SceneDelegate, удалите его и удалите ссылку на info.plist. - person Frankenstein; 05.06.2020
comment
о да, я удалил как файл SceneDelegate, так и его ссылку, после чего он работает .. спасибо за эту информацию - person iOSApp; 06.06.2020
comment
если есть шанс, пожалуйста, предложите мне здесь stackoverflow.com/questions/63406320/ - person iOSApp; 14.08.2020

Попробуйте использовать это расширение

  // add this function in your AppDelegate

  func makeRootVC(_ storyBoardName : String, _ vcName : String) {
        let vc = UIStoryboard(name: storyBoardName, bundle: Bundle.main).instantiateViewController(withIdentifier: vcName)
        let nav = UINavigationController(rootViewController: vc)
        nav.navigationBar.isHidden = true
        self.window?.rootViewController = nav
        let options: UIView.AnimationOptions = .transitionCrossDissolve
        let duration: TimeInterval = 0.6
        UIView.transition(with: self.window!, duration: duration, options: options, animations: {}, completion: nil)
    }

затем используйте это в своем didFinishLaunchingWithOptions

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

    savedUserId = KeychainWrapper.standard.string(forKey: "USERID")
    print("appdelegate userid \(savedUserId)")
    if savedUserId != nil{
        print("saveuserid \(savedUserId)")
        self.makeRootVC("Main","MainViewController")
    }
    return true
}
person iOSArchitect.com    schedule 05.06.2020
comment
UIView.transition (с: self.window !, длительностью: продолжительностью, параметрами: параметрами, анимацией: {}, завершением: ноль). ошибка: поток 1: фатальная ошибка: неожиданно обнаружен ноль при разворачивании необязательного значения - person iOSApp; 05.06.2020
comment
@iOSApp Вы тоже используете SceneDelegate? - person iOSArchitect.com; 05.06.2020
comment
да SceneDelegate есть, но в той же строке та же ошибка - person iOSApp; 05.06.2020
comment
@iOSApp Обратитесь к этому, чтобы установить rootViewController из sceneDelegate stackoverflow.com/questions/58188296/ - person iOSArchitect.com; 05.06.2020

проверьте, является ли окно равным нулю, и добавьте makeKeyAndVisible () после установки rootViewController в AppDelegate

if(window == nil){
    self.window = UIWindow(frame:UIScreen.main.bounds)
}
if savedUserId != nil{
    print("saveuserid \(savedUserId)")
    let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
    window?.rootViewController = mainStoryBoard.instantiateViewController(withIdentifier: "MainViewController")
    self.window?.makeKeyAndVisible()
}
person SM Abu Taher Asif    schedule 05.06.2020
comment
если я печатаю идентификатор пользователя в if(window == nil){, оба отпечатка, но не собираюсь в mainviewcontroller - person iOSApp; 05.06.2020