Подтвердить что ты не робот

Сброс раскадровки при выходе из системы

Я создаю приложение для веб-клиента IOS 5.1, в котором используется раскадровка. Одним из моих действий является "выход из системы", во время которого я хочу, чтобы reset мой корневой вид в исходное представление, созданное корневым представлением раскадровки. (Когда вы входите в систему, некоторые элементы просмотра удаляются или добавляются на основе того, кто вы есть: когда вы выходите из системы, я хочу, чтобы reset их значения по умолчанию, которые я указал в раскадровке.)

Я понимаю, что я мог программно reset/повторно добавлять все элементы, но тогда какая польза от раскадровки? Я полагаю, что должен быть способ вернуться к квадрату, перезагрузив файл вида, верно?

4b9b3361

Ответ 1

Я нашел, что для меня работает следующий подход. Обратите внимание, что я использую ARC, не уверен, что это имеет большое значение для решения. Во-первых, в классе делегата приложения, в application:didFinishLaunchingWithOptions: я беру экземпляр inital Storyboard со следующей строкой кода:

_initalStoryboard = self.window.rootViewController.storyboard;

(Очевидно, существует переменная экземпляра UIStoryboard* _initalStoryboard;)

Затем у меня есть следующая функция, определенная в моем делете приложения:

- (void)resetWindowToInitialView
{
    for (UIView* view in self.window.subviews)
    {
        [view removeFromSuperview];
    }

    UIViewController* initialScene = [_initalStoryboard instantiateInitialViewController];
    self.window.rootViewController = initialScene;
}

Обратите внимание на цикл for in, который удаляет все подпункты из window. Документация UIWindow rootViewController гласит:

Если окно имеет существующую иерархию представлений, старые представления удалены до того, как будут установлены новые.

Однако я не нашел, что это так... поэтому я сначала удаляю существующие представления, прежде чем назначать новый rootViewController. Используя этот метод, я не обнаружил никаких побочных эффектов или утечек памяти. Я никоим образом не специалист по магии UIKit, поэтому я бы предложил вам протестировать тест и протестировать это решение, если вы планируете использовать его самостоятельно. Приветствия

Ответ 2

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

UIWindow *window = [[UIApplication sharedApplication].windows firstObject];
UINavigationController *navController = (UINavigationController *)window.rootViewController;
UIViewController *vc = [navController.storyboard instantiateViewControllerWithIdentifier:@"Login"];
navController.viewControllers = @[vc];

Вы должны назначить идентификатор раскадровки "Вход" в свой VC входа в систему, чтобы это работало.

Ответ 3

Для меня работает следующее, если я использую структуру на основе UISplitViewController (проверенную на iOS 8 +):

Удалить раскадровку из проектов Общие Информация о развертывании, поэтому выпадающее меню выглядит как показано ниже, и вам нужно настроить раскадровку в коде.

Информация о развертывании Пустой основной интерфейс

Где-то в AppDelegate.m

- (void)setupViewControllers
{
    // check for thread, as this method might be called by other (e.g. logout) logic
    if ([NSThread currentThread] != [NSThread mainThread]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self setupViewControllers];
        });
        return;
    }

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    UIViewController *vc =[storyboard instantiateInitialViewController];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = vc;

    // configure split vc 
    // Note: I reference split vc for my own purpose, but it is your mater of choice
    self.splitViewController = (UISplitViewController *)self.window.rootViewController;
    self.splitViewController.delegate = self;
    self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
    self.splitViewController.preferredPrimaryColumnWidthFraction = 0.5;

    [self.window makeKeyAndVisible];
}

Чтобы избежать дублирования кода, вызовите эту функцию из application:didFinishLaunchingWithOptions: в качестве первой настройки

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // some code...
    [self setupViewControllers];
    // Optional: add splash view (e.g. [self addSplashView];)
    // some code...
}

Внутри контроллера представления вы готовы предоставить пользовательский интерфейс пользователю, удалите всплеск. Например (в Swift):

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    if !AppSession.currentSession().isLoggedIn() {
        presentLoginViewController(false, completion: { ()->Void in
            self.removeSplash()
        })
    }
    else {
       removeSplash()
    }

    // some code...
}

private func removeSplash() {
    if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
        appDelegate.removeSplashView()
    }
}