Вернитесь к контроллеру исходного представления, когда пользователь выходит из системы

Я работаю над приложением, использующим интеграцию с Facebook, и теперь система log in отлично работает. Тем не менее, я не могу вернуться к своему начальному контроллеру представления, когда пользователь нажимает log out.

Вот обзор моего storyboard:

Screenshot of storyboard

Я хотел бы вернуться к началу, когда пользователь нажимает кнопку blue button (вверху). Что я сделал бы для этого? Как видите, у меня есть несколько Navigation Controllers, и я использую только Push-segues, чтобы туда добраться. Однако я использую SWRevealViewController, который вы можете видеть посередине.

Я пробовал [self.navigationController popToRootViewControllerAnimated:YES];, который ничего не делает.

Любые советы? Кто-нибудь знаком с SWRevealViewController и что он мог бы сделать в моем стеке Navigation? Любая помощь будет оценена!

Спасибо.

Ответ 1

Попробуйте это,

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"NameOfYourStoryBoard" 
                                                     bundle:nil];
LoginViewController *add = 
           [storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"];

[self presentViewController:add 
                   animated:YES 
                 completion:nil];

Ответ 2

Прежде всего, я не думаю, что вам нужно много UINavigationControllers. Использовать только один в приложении достаточно. Причина, по которой popToRootViewController не работает в вашем случае, состоит в том, что она перейдет к первому контроллеру представления с помощью UINavigationController. У вас есть множество UINavigationControllers, поэтому, когда вы нажимаете синюю кнопку в контроллере представлений настроек, он переходит к контроллеру просмотра боковой панели (не может прочитать его правильно, изображение мало).

Вы можете сделать следующее, чтобы перейти к контроллеру корневого представления вашего приложения:

UINavigationController *rootController =[(UINavigationController*)[(AppDelegate*)
        [[UIApplication sharedApplication]delegate] window] rootViewController]];

Замените AppDelegate тем, что он вызвал в вашем приложении.

Но мой совет - удалить все промежуточные UINavigationControllers. Тогда просто делать popToRootViewController должен сделать трюк.

Ответ 3

Введите ниже метод в корневом представлении

- (IBAction)returnToDashboard:(UIStoryboardSegue *)segue;

Дайте соединение segue с контроллером вида назначения, как показано ниже. see in image

Дайте идентификатор для выделения и присвоения метода этому сегменту

Like below image

использовать ниже метод в контроллере представления назначения

 [self performSegueWithIdentifier:@"pushtoDashboard" sender:self];

Ответ 4

Проблема

Вы хотите вернуться из контроллера представления (источника) в начало (a контроллер точки назначения), когда пользователь нажимает синюю кнопку (на вверху)

Рекомендация

Я рекомендую вам быстро взглянуть на высоко оцененный SO-ответ, который демонстрирует, как использовать разматывание segue (чтобы маленький зеленый поле выхода на вашем контроллере просмотра в раскадровка). Unwind segues - это современный способ достижения вашей цели, но вы также можете вызвать rejectViewController: анимированный из исходного контроллера. Вы также должны быстро прочитать небольшую заметку Apple (TN2298) при использовании разматывания segue.

По существу, вы захотите добавить следующий контроллер точки назначения:

- (IBAction)unwindToMainMenu:(UIStoryboardSegue*)sender
{
}

Затем используйте Ctrl + перетащить и щелкните с синей кнопки до зеленого значка выхода на контроллере представления источника. Появится меню, и вы можете выбрать unwindToMainMenu из списка. Вам нужно будет указать новый идентификатор в Identity Inspector (например, segueToMain).

Ручная размотка

Техническая заметка выше (TN2298) также покажет вам, как вы можете создать ручную размотку, которая может быть названа программным способом (подобно тому, как можно сказать, выполнить функциюSegueWithIdentifier...).

Manual Unwind

Ответ 5

Я использую быстро, и то, что сработало для меня, было следующим:

var loginVC: UIViewController? = self.storyboard?.instantiateViewControllerWithIdentifier("UILogin") as?    UIViewController

self.presentViewController(loginVC!, animated: true, completion: nil)

Ответ 6

Я работал над очень похожей проблемой. Я использую раскадровку с контроллером навигации и реализовал рекомендованный SWRevealViewController с iOS 7 и Xcode 5.1. Я безуспешно пытался реализовать некоторые из решений. Либо экран не изменился, либо я получил пустой стол. Я использовал гибридную версию программных примеров, представленных в SWRevealController, и другие ответы здесь, чтобы получить рабочее решение. Я добавил это отдельно от моего действия кнопки входа в систему

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
InboxTableViewController *viewController = [storyBoard instantiateViewControllerWithIdentifier:@"inbox"];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.revealViewController pushFrontViewController:nav animated:YES];

Я извлек свою раскадровку и инициировал контроллер представления, который я хотел от раскадровки, а затем добавил в контроллер навигации. Наконец, я использовал метод SWRevealViewController для ввода представления, которое я хотел видеть спереди.

Ответ 7

Когда у вас разные раскадровки, просто "представление" требуемого VC из исходного раскадровки делает трюк:

Swift 3

if let loginVC = UIStoryboard(name: "Login", bundle: nil).instantiateInitialViewController() {
   present(loginVC, animated: true, completion: nil)
}

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

if let subviews = UIApplication.shared.keyWindow?.subviews,
    let transitionViewClass = NSClassFromString("UITransitionView") {
    for subview in subviews where subview.isKind(of: transitionViewClass) {
        subview.removeFromSuperview()
    }
}

< - Это работает с Xcode 8.2.1 и iOS 10.2, но не гарантирует, что будет работать навсегда. Будьте осторожны с ним.