当我使用新的UINavigationController设置window.rootViewController时,如何清除UINavigationController的viewControllers

时间:2016-01-21 09:24:19

标签: ios objective-c

我的英语不好,所以我的表情可能不清楚,抱歉。 我直接展示我的代码: appdelegate.m

Dly_navigationController* rootVC = nil;

if ([[NSUserDefaults standardUserDefaults] objectForKey:@"loginFlag"] != nil) {
    HS_HomeViewController* homeVC = [[HS_HomeViewController alloc] init];
    rootVC = [[Dly_navigationController  alloc] initWithRootViewController:homeVC];
}
else {
    HS_LoginViewController* loginVC = [[HS_LoginViewController alloc] init];
    rootVC = [[Dly_navigationController alloc] initWithRootViewController:loginVC];
}
self.window.rootViewController = rootVC;

我想在我的应用运行时登录。我这样做:

- (void)gotoLogin {

    HS_LoginViewController *tmpLogin = [[HS_LoginViewController alloc] init];
    Dly_navigationController* rootView = [[Dly_navigationController alloc] initWithRootViewController:tmpLogin];
    AppDelegate *thisDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

    [thisDelegate.window setRootViewController:rootView]; 
}

它运行良好,但旧的rootViewController和其他旧的VC不会发布。这给后续操作带来了不好的影响。例如,通知的事情。

感谢您阅读我的问题和我的英语。

3 个答案:

答案 0 :(得分:0)

我的建议,只使用推送另一个视图控制器的单个导航控制器。

将LoginVC设置为导航根。然后在LoginVC的DidLoad上,检查用户是否已登录。如果有效登录,则只需按下带有动画的控制器。这样,用户将无法获得任何效果并直接转移到HomeVC。您可以使用validLogin登录方法进行管理。在这里你可以推动动画。

在这种情况下,如果要从应用程序的任何位置注销,root将是LoginVC。

请根据您的需要维护NavigationBar

<强> AppDelegate.m

HS_LoginViewController* loginVC = [[HS_LoginViewController alloc] init];
Dly_navigationController* rootVC = [[Dly_navigationController  alloc] initWithRootViewController:loginVC];

self.window.rootViewController = rootVC;

登录页面

AppDelegate *thisDelegate;

- (void)viewDidLoad
{
     thisDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

     if ([[NSUserDefaults standardUserDefaults] objectForKey:@"loginFlag"] != nil) {

         HS_HomeViewController* homeVC = [[HS_HomeViewController alloc] init];
         [thisDelegate.rootVC pushViewController:homeVC animated:false];
     }
     //... Your Code
}

- (void)validLogin
{
     //Set your Login flag with defaults
     HS_HomeViewController* homeVC = [[HS_HomeViewController alloc] init];
     [thisDelegate.rootView pushViewController:homeVC animated:true];
}

希望,我的方案会帮助你。

感谢。

答案 1 :(得分:0)

在ARC中,当您将窗口的rootViewController分配给其他viewController时,没有对旧的rootViewController的强引用。 如果旧的rootViewController不是dealloc,那么可能存在强大的引用周期,所以我认为你应该检查你的HS_HomeViewController类的实现来找出这个问题。

答案 2 :(得分:0)

我认为代码中存在强大的参考周期,您可以使用分析工具找出问题所在。