首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改rootViewController的UIWindow

更改rootViewController的UIWindow
EN

Stack Overflow用户
提问于 2013-07-13 16:23:52
回答 5查看 14.2K关注 0票数 25

当我的应用程序第一次加载时,我将UIWindowUIWindow属性设置为controllerA

在我的应用程序的某个时候,我选择将rootViewController更改为controllerB

问题是,有时当我在controllerB中做翻转转换时,我看到了controllerA的观点。出于某种原因,该视图没有被删除。更令人担忧的是,在将rootViewController设置为controllerB之后,controllerAdealloc方法从未被炒鱿鱼。

我已经尝试过在切换到UIWindow之前手动删除controllerB的子视图,这解决了在后台查看controllerA视图的问题,但是controllerA的dealloc仍然没有被调用。这里发生了什么?

苹果医生说:

根视图控制器提供窗口的内容视图。将视图控制器分配给此属性(以编程方式或使用Interface )将视图控制器的视图安装为窗口的内容视图。如果窗口具有现有的视图层次结构,则在安装新视图之前删除旧视图。

更新

以下是我的AppDelegate代码:

代码语言:javascript
复制
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self showControllerA];
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)showControllerA
{
    ControllerA* a = [ControllerA new];
    self.window.rootViewController = a;
}

- (void) showControllerB {
    ControllerB* b = [ControllerB new];
    self.window.rootViewController = b;
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-07-16 05:35:37

事实证明,有两个不同的问题。1)我在控制器A中有一个保留周期,所以它永远不会被取消。第二,为了改变根视图控制器,您必须首先删除windows子视图(即使文档中有相反的建议)。

票数 10
EN

Stack Overflow用户

发布于 2013-07-14 01:41:28

问题可能在于您的ControllerA或ControllerB的实现,它们可能在代码中保留“self”,因此ARC无法自动释放您的ViewController。你能给你发ControllerA和ControllerB实现吗?

票数 1
EN

Stack Overflow用户

发布于 2018-07-27 12:34:39

代码语言:javascript
复制
var loginNavigationController: OnBoardViewController?{
    willSet{
        if newValue == nil {
            loginNavigationController?.view.removeFromSuperview()
        }
    }
}

loginNavigationController =零

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17632024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档