Переход непосредственно к контроллеру Main View для уже вошедшего в систему пользователя

У меня есть loginViewController в качестве моего rootviewcontroller, за которым следует главный экран, а затем другие экраны. Мои взгляды следуют подходу push and pop. Я хочу, чтобы, если пользователь уже вошел в систему, на мой взгляд, он должен начать с главного экрана, иначе начать с экрана входа в систему, и если я выйду из главного экрана, он должен вернуться на экран входа в систему, а структура push и pop должна быть сохранена. Я могу добиться этого с помощью модального перехода, но мне нужно использовать подход push и pop, возможно ли это? В настоящее время я проверил условие входа в систему в своем делегате приложения, чтобы установить контроллер rootview, но он терпит неудачу, если я пытаюсь выйти из системы, поскольку его нет в моем стеке навигационного контроллера.

if !alreadyLoggedin
{
    let mainListVC = storyBoard.instantiateViewControllerWithIdentifier(“MainListViewController”)
    self.window!.rootViewController = mainListVC
}
else
{
    let loginVC = storyBoard.instantiateViewControllerWithIdentifier("ViewController")
    self.window!.rootViewController = loginVC
}

person Francis F    schedule 26.02.2016    source источник
comment
не могли бы вы показать код выхода?   -  person Tejas Ardeshna    schedule 26.02.2016
comment
При выходе из системы я просто открываю currentviewcontroller, используя self.navigationController?.popViewControllerAnimated(true)   -  person Francis F    schedule 26.02.2016
comment
вы должны написать let storyboard = UIStoryboard(name: MyStoryboardName, bundle: nil) let vc = storyboard.instantiateViewControllerWithIdentifier(loginViewController) as! UIViewController self.presentViewController(vc, анимированный: true, завершение: ноль) при выходе из системы   -  person Tejas Ardeshna    schedule 26.02.2016
comment
или пусть loginVC = storyBoard.instantiateViewControllerWithIdentifier(ViewController) self.window!.rootViewController = loginVC   -  person Tejas Ardeshna    schedule 26.02.2016
comment
ты ее решил?   -  person Badal Shah    schedule 26.02.2016
comment
Если я это сделаю, контроллер представления основного экрана все еще не останется в стеке, а представление не приведет к переходу push-pop   -  person Francis F    schedule 26.02.2016
comment
@BadalShah, у меня есть обычный способ использования настоящего метода, но мне придется скомпрометировать анимацию push-pop.   -  person Francis F    schedule 26.02.2016


Ответы (2)


Это основной вариант использования. Пожалуйста, следуйте моим инструкциям.

  1. В вашей истории создайте контроллер представления навигации с контроллером представления.
  2. Выберите контроллер представления навигации в качестве начального контроллера представления в раскадровке.
  3. Создайте три контроллера представлений — InitialViewController, LoginViewController и MainViewController и установите идентификатор раскадровки для всех контроллеров представлений.

Создал образец проекта для вас. Ссылка для скачивания (https://www.dropbox.com/s/zk8x7ptg5mzmotk/test.zip?dl=0)

person Vignesh Kumar    schedule 26.02.2016
comment
Да, это сработает, но мне также нужно поддерживать анимацию push и pop. Поэтому, если я включу анимацию, я увижу, что между ними появляется InitialViewController. - person Francis F; 26.02.2016
comment
Попробуйте загрузить его минимально воспроизводимый пример (dropbox.com/s/zk8x7ptg5mzmotk/test.zip?dl=0).. я добавил анимацию. - person Vignesh Kumar; 26.02.2016
comment
Какой у вас код для выхода? Возможно ли, что представление входа в систему (и все данные/учетные данные) проходят через deinit (поэтому потеряно)? Если вы поместите оператор печати в deinit, вы сможете подтвердить статус представления. Теоретически вы могли бы использовать rejectViewController, чтобы вернуться на экран входа в систему... - person zevij; 28.02.2016
comment
Нет необходимости в отклонении ViewController, чтобы вернуть экран входа в систему. Bcz Я использовал Show segue type (PUSH) для перехода от входа в систему к контроллеру основного представления. Я использовал для выхода из системы.. self.navigationController?.popToRootViewControllerAnimated(true) - person Vignesh Kumar; 29.02.2016

Вам нужно использовать. AppDelegate

Цель C

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"LoginStatus"]) {
        UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"loginController"];
    }else{
        UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"RootView"];

    }

}

SWIFT — надеюсь, это правильно

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {

      //Using UserDefaults check already loggedin user or not
        if (!someStatus) {

            let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
            let vc = storyboard.instantiateViewControllerWithIdentifier("someViewController") as! UIViewController
            self.presentViewController(vc, animated: true, completion: nil)

        }else{


            let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
            let vc = storyboard.instantiateViewControllerWithIdentifier("loginViewController") as! UIViewController
            self.presentViewController(vc, animated: true, completion: nil)

        }

    }
person Im Batman    schedule 26.02.2016
comment
Это то же самое, что я сделал, и когда я выхожу из системы, он не переходит в режим входа в систему. - person Francis F; 26.02.2016
comment
Значение типа «AppDelegate» не имеет члена «presentViewController». - person Dhanu K; 19.03.2020