25

当我的应用首次加载时,我将rootViewControllermy 的属性设置UIWindowcontrollerA.

在我的应用程序中的某个时候,我选择rootViewControllercontrollerB.

问题是,有时当我在 中进行翻转过渡时controllerB,我会看到controllerA's 背后的视图。由于某种原因,该视图没有被删除。更令人担忧的是,在设置rootViewControllerto之后controllerBcontrollerA'sdealloc方法永远不会被触发。

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

苹果文档说:

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

更新

这是我的 AppDelegate 的代码:

- (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;
}
4

5 回答 5

10

事实证明有两个不同的问题。1)我在控制器 A 中有一个保留周期,所以它永远不会被释放。其次,为了更改根视图控制器,您必须先删除 Windows 子视图(即使文档另有建议)

于 2013-07-16T05:35:37.420 回答
1

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

于 2013-07-14T01:41:28.497 回答
0
var loginNavigationController: OnBoardViewController?{
    willSet{
        if newValue == nil {
            loginNavigationController?.view.removeFromSuperview()
        }
    }
}

登录导航控制器 = 无

于 2018-07-27T12:34:39.747 回答
0

这是苹果的错误,我们假设 ViewControllerA 为当前的 rootViewController:

// ViewControllerA.m
- (void)buttonClick {
    [self dismissViewControllerAnimated:YES completion:^{
        // [((AppDelegate *)[[UIApplication sharedApplication] delegate]) resetRoot]; // OK
    }];

    [((AppDelegate *)[[UIApplication sharedApplication] delegate]) resetRoot]; // ViewControllerA's view will not dealloc 
}

// AppDelegate.m
- (void)resetRoot {
    ViewControllerB *controller = [[ViewControllerB alloc] init];
    self.window.rootViewController = controller;
}

如果将窗口的 rootViewController 重置为此代码,则 ViewControllerA 的视图将永远不会释放。

于 2018-11-13T02:18:41.513 回答
0

一个更简单的解决方案是将backgroundColor新窗口的颜色设置为.white或任何颜色。默认值为 nil,这会产生透明背景。这就是为什么旧窗口(在其顶部可见新窗口)被透视的原因。

于 2019-11-21T17:03:49.287 回答