Сброс раскадровки при выходе из системы
Я создаю приложение для веб-клиента IOS 5.1, в котором используется раскадровка. Одним из моих действий является "выход из системы", во время которого я хочу, чтобы reset мой корневой вид в исходное представление, созданное корневым представлением раскадровки. (Когда вы входите в систему, некоторые элементы просмотра удаляются или добавляются на основе того, кто вы есть: когда вы выходите из системы, я хочу, чтобы reset их значения по умолчанию, которые я указал в раскадровке.)
Я понимаю, что я мог программно reset/повторно добавлять все элементы, но тогда какая польза от раскадровки? Я полагаю, что должен быть способ вернуться к квадрату, перезагрузив файл вида, верно?
Ответы
Ответ 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()
}
}