Изменение контроллера корневого представления в фоновом режиме

У меня есть следующий стек контроллеров представления.

Во-первых, мое приложение покажет страницу тура по приложению. (Скажем, TourViewController - суперкласс UIViewController). Добавил этот контроллер в AppDelegate как rootviewcontroller.

self.window.rootViewController = tourViewController;

Затем на странице тура, если пользователь нажимает кнопку «Войти», я представляю второй контроллер представления (скажем, LoginViewController - суперкласс UIViewController).

UINavigationController *loginNavigationController = [[UINavigationController alloc] initWithRootViewController:self.loginViewController];
[self presentViewController:loginNavigationController animated:YES completion:nil];

После успешного входа в систему мне нужно отказаться от второго контроллера представления (LoginViewController) и я хочу показать представление на основе панели вкладок для дальнейших нужд.

Я попробовал этот код внутри метода успешного входа в систему.

[self dismissViewControllerAnimated:YES completion:^{

        TabBarViewController *tabController = [[TabBarViewController alloc] init];

        [self presentViewController:tabController animated:NO completion:nil];

        AppDelegate *applicationDelegate = [[UIApplication sharedApplication] delegate];
        applicationDelegate.window.rootViewController = tabController;

    }];

Проблемы:

  • Когда я нахожусь в LoginViewController, у меня есть два контроллера представления в моем стеке. Так что даже я отказываюсь от LoginViewController, другой (TourViewController) остается на экране.

  • Если я попробовал приведенный выше код, контроллер вкладки bat был успешно добавлен в качестве контроллера корневого представления. Но, когда LoginViewController ушел в отставку, фон был заполнен TourViewController

Что мне нужно, так это то, что когда я ухожу в отставку с LoginViewController, фоновое представление должно быть контроллером панели вкладок вместо TourViewController.

Нужна помощь!!


person Confused    schedule 09.09.2015    source источник
comment
Простое решение состоит в том, что назначьте свой loginviewcontroller в качестве корневого представления вместо его представления, а затем, когда вы успешно войдете в систему, назначьте свой tabbarcontroller в качестве корневого представления.   -  person Dipen Panchasara    schedule 09.09.2015


Ответы (2)


вы можете изменить контроллер корневого представления в AppDelegate, а не в методе успеха loginNavigationController лучше, вы можете сделать это так

in AppDelegate.h

 #import <UIKit/UIKit.h>
 #import "TabControllerViewController.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

- (void)showTabController;  //add this method call from on success method of log in completion 
@end

in AppDelegate.m

- (void)showTabController;
 {
   TabControllerViewController *tabController =    [[TabControllerViewController alloc]  initWithNibName:@"TabControllerViewController" bundle:nil];
  self.window.rootViewController = tabController;
 [self.window makeKeyAndVisible];
}

и в loginNavigationController.m

[self dismissViewControllerAnimated:YES completion:^{

    //TabBarViewController *tabController = [[TabBarViewController alloc] init];

  //  [self presentViewController:tabController animated:NO completion:nil]; //no nee to present 

    AppDelegate *applicationDelegate = [[UIApplication sharedApplication] delegate];
     [applicationDelegate showTabController]; //there is no need to create a tab bar in loginview controller, create it in root view controller 
    //applicationDelegate.window.rootViewController = tabController;

}];

ПРИМЕЧАНИЕ: приведенное выше не проверено, просто попробуйте один раз

Изменить 1

вы можете сделать это одним способом, но с другой анимацией, сформируйте этот ответ, вы можете перейти во второе окно например, сделав анимацию

in in AppDelegate.h

#import <UIKit/UIKit.h>
#import "TabViewController.h"
#import "LoginViewController.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window; //holds initial window, holds tour and login controller
@property (strong, nonatomic) UIWindow *tabWindow; //holds only tab controller 
//..other code below is my test 
@property (strong, nonatomic) TabViewController *tabViewController;
@property (strong, nonatomic) LoginViewController *loginController;
- (void)showTabController;
@end

in AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
   _tabWindow = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
   _window    = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];

   // Override point for customization after application launch.
   _loginController = [[LoginViewController alloc]initWithNibName:@"LoginViewController" bundle:nil];
   _tabViewController = [[TabViewController alloc] initWithNibName:@"TabViewController" bundle:nil];

    self.window.rootViewController = _loginController; //for test for your case it contains tour view controller  
    [self.window makeKeyAndVisible];
    return YES;
 }

 - (void)showTabController;
 {
    [UIView transitionWithView:self.window duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
    self.window.rootViewController = _tabViewController;
    } completion:^(BOOL finished) {
      // [_tabWindow makeKeyAndVisible];
    }];
 }
person Shankar BS    schedule 09.09.2015
comment
Привет, спасибо за ответ. Я пробовал это, он работает нормально, но не заполняет, а требует. Кстати, должен ли я всегда инициировать панель вкладок в AppDelegate? - person Confused; 09.09.2015
comment
да, после успешного входа в систему нет необходимости в контроллере входа в систему, а делегат приложения - это тот, который удерживает ваш контроллер tabview, и в функции он упрощает доступ к вашему делегату формы контроллера tabview - person Shankar BS; 09.09.2015
comment
Ваш код отлично работает с правильным объявлением контроллера панели вкладок. Но я хочу показать контроллер панели вкладок в качестве фона, когда мой второй контроллер (LoginViewController) уходит в отставку. Вы можете помочь в этом? - person Confused; 09.09.2015

Сделай одно,

Создайте UINavigationController в AppDelegate.h, чтобы вы могли получить к нему доступ из любого места.

Логика

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

Итак, прежде всего вам нужно создать объект ViewController/Tabbarcontroller и назначить его для navigationController, а затем показать navigationController.

AppDelegate* myDelegate = (((AppDelegate*) [UIApplication sharedApplication].delegate));
InitialViewController *initialVC = [self.storyboard instantiateViewControllerWithIdentifier:@“InitialVC"];
myDelegate.navController = [[UINavigationController alloc] initWithRootViewController:initialVC];
myDelegate.window.rootViewController = myDelegate.navController;
[myDelegate.window makeKeyAndVisible];
person Chetan Prajapati    schedule 09.09.2015
comment
это не проблема - person Chetan Prajapati; 09.09.2015
comment
просто вам нужно создать объект, например, инициализировать его. - person Chetan Prajapati; 09.09.2015