Swapping rootViewController on UIWindow does not deallocate view controller
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
If you swap out a rootViewController
in UIWindow
, for example, to present a log in window, if the rootViewController
has presented (modal) view controllers, those presented view controllers and possibly the old rootViewController will not be deallocated.
self.window.rootViewController = newViewController
ios uikit
add a comment |
If you swap out a rootViewController
in UIWindow
, for example, to present a log in window, if the rootViewController
has presented (modal) view controllers, those presented view controllers and possibly the old rootViewController will not be deallocated.
self.window.rootViewController = newViewController
ios uikit
add a comment |
If you swap out a rootViewController
in UIWindow
, for example, to present a log in window, if the rootViewController
has presented (modal) view controllers, those presented view controllers and possibly the old rootViewController will not be deallocated.
self.window.rootViewController = newViewController
ios uikit
If you swap out a rootViewController
in UIWindow
, for example, to present a log in window, if the rootViewController
has presented (modal) view controllers, those presented view controllers and possibly the old rootViewController will not be deallocated.
self.window.rootViewController = newViewController
ios uikit
ios uikit
asked Nov 21 '18 at 22:03
Marc EtcheverryMarc Etcheverry
681710
681710
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
You must always do a dismissal of all modals when swapping out the rootViewController, otherwise there will be a retain cycle.
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
If you want to do a nice transition, you could always wrap it in an animation:
func transition() {
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
}
UIView.transition(with: window!,
duration: 0.3,
options: .transitionCrossDissolve,
animations: transition)
Even better, don’t do that. You shouldn’t change the root view controller.
– matt
Nov 21 '18 at 22:45
1
This is mostly right. For securely removal, here is one point :self.myWindow?.rootViewController?.dismiss(animated: false, completion: { self.myWindow?.rootViewController = newViewController })
– E.Coms
Nov 22 '18 at 2:01
@matt I see nothing in the documentation stating that changing the root view controller of a window is discouraged, it is a readwrite property. Much safer than dealing with existing view hierarchy in the existing root view controller or using view controller containment in a "base" root view controller.
– Marc Etcheverry
Nov 23 '18 at 3:15
@E.Coms Thank you, that is right! I assume completion is called even if there aren't any modals presented. Otherwise you would need a check onpresentedViewController
, I will do some testing later
– Marc Etcheverry
Nov 23 '18 at 3:17
I disagree obviously.
– matt
Nov 23 '18 at 3:44
|
show 4 more comments
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53421089%2fswapping-rootviewcontroller-on-uiwindow-does-not-deallocate-view-controller%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You must always do a dismissal of all modals when swapping out the rootViewController, otherwise there will be a retain cycle.
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
If you want to do a nice transition, you could always wrap it in an animation:
func transition() {
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
}
UIView.transition(with: window!,
duration: 0.3,
options: .transitionCrossDissolve,
animations: transition)
Even better, don’t do that. You shouldn’t change the root view controller.
– matt
Nov 21 '18 at 22:45
1
This is mostly right. For securely removal, here is one point :self.myWindow?.rootViewController?.dismiss(animated: false, completion: { self.myWindow?.rootViewController = newViewController })
– E.Coms
Nov 22 '18 at 2:01
@matt I see nothing in the documentation stating that changing the root view controller of a window is discouraged, it is a readwrite property. Much safer than dealing with existing view hierarchy in the existing root view controller or using view controller containment in a "base" root view controller.
– Marc Etcheverry
Nov 23 '18 at 3:15
@E.Coms Thank you, that is right! I assume completion is called even if there aren't any modals presented. Otherwise you would need a check onpresentedViewController
, I will do some testing later
– Marc Etcheverry
Nov 23 '18 at 3:17
I disagree obviously.
– matt
Nov 23 '18 at 3:44
|
show 4 more comments
You must always do a dismissal of all modals when swapping out the rootViewController, otherwise there will be a retain cycle.
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
If you want to do a nice transition, you could always wrap it in an animation:
func transition() {
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
}
UIView.transition(with: window!,
duration: 0.3,
options: .transitionCrossDissolve,
animations: transition)
Even better, don’t do that. You shouldn’t change the root view controller.
– matt
Nov 21 '18 at 22:45
1
This is mostly right. For securely removal, here is one point :self.myWindow?.rootViewController?.dismiss(animated: false, completion: { self.myWindow?.rootViewController = newViewController })
– E.Coms
Nov 22 '18 at 2:01
@matt I see nothing in the documentation stating that changing the root view controller of a window is discouraged, it is a readwrite property. Much safer than dealing with existing view hierarchy in the existing root view controller or using view controller containment in a "base" root view controller.
– Marc Etcheverry
Nov 23 '18 at 3:15
@E.Coms Thank you, that is right! I assume completion is called even if there aren't any modals presented. Otherwise you would need a check onpresentedViewController
, I will do some testing later
– Marc Etcheverry
Nov 23 '18 at 3:17
I disagree obviously.
– matt
Nov 23 '18 at 3:44
|
show 4 more comments
You must always do a dismissal of all modals when swapping out the rootViewController, otherwise there will be a retain cycle.
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
If you want to do a nice transition, you could always wrap it in an animation:
func transition() {
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
}
UIView.transition(with: window!,
duration: 0.3,
options: .transitionCrossDissolve,
animations: transition)
You must always do a dismissal of all modals when swapping out the rootViewController, otherwise there will be a retain cycle.
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
If you want to do a nice transition, you could always wrap it in an animation:
func transition() {
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
}
UIView.transition(with: window!,
duration: 0.3,
options: .transitionCrossDissolve,
animations: transition)
edited Nov 26 '18 at 19:01
answered Nov 21 '18 at 22:03
Marc EtcheverryMarc Etcheverry
681710
681710
Even better, don’t do that. You shouldn’t change the root view controller.
– matt
Nov 21 '18 at 22:45
1
This is mostly right. For securely removal, here is one point :self.myWindow?.rootViewController?.dismiss(animated: false, completion: { self.myWindow?.rootViewController = newViewController })
– E.Coms
Nov 22 '18 at 2:01
@matt I see nothing in the documentation stating that changing the root view controller of a window is discouraged, it is a readwrite property. Much safer than dealing with existing view hierarchy in the existing root view controller or using view controller containment in a "base" root view controller.
– Marc Etcheverry
Nov 23 '18 at 3:15
@E.Coms Thank you, that is right! I assume completion is called even if there aren't any modals presented. Otherwise you would need a check onpresentedViewController
, I will do some testing later
– Marc Etcheverry
Nov 23 '18 at 3:17
I disagree obviously.
– matt
Nov 23 '18 at 3:44
|
show 4 more comments
Even better, don’t do that. You shouldn’t change the root view controller.
– matt
Nov 21 '18 at 22:45
1
This is mostly right. For securely removal, here is one point :self.myWindow?.rootViewController?.dismiss(animated: false, completion: { self.myWindow?.rootViewController = newViewController })
– E.Coms
Nov 22 '18 at 2:01
@matt I see nothing in the documentation stating that changing the root view controller of a window is discouraged, it is a readwrite property. Much safer than dealing with existing view hierarchy in the existing root view controller or using view controller containment in a "base" root view controller.
– Marc Etcheverry
Nov 23 '18 at 3:15
@E.Coms Thank you, that is right! I assume completion is called even if there aren't any modals presented. Otherwise you would need a check onpresentedViewController
, I will do some testing later
– Marc Etcheverry
Nov 23 '18 at 3:17
I disagree obviously.
– matt
Nov 23 '18 at 3:44
Even better, don’t do that. You shouldn’t change the root view controller.
– matt
Nov 21 '18 at 22:45
Even better, don’t do that. You shouldn’t change the root view controller.
– matt
Nov 21 '18 at 22:45
1
1
This is mostly right. For securely removal, here is one point :
self.myWindow?.rootViewController?.dismiss(animated: false, completion: { self.myWindow?.rootViewController = newViewController })
– E.Coms
Nov 22 '18 at 2:01
This is mostly right. For securely removal, here is one point :
self.myWindow?.rootViewController?.dismiss(animated: false, completion: { self.myWindow?.rootViewController = newViewController })
– E.Coms
Nov 22 '18 at 2:01
@matt I see nothing in the documentation stating that changing the root view controller of a window is discouraged, it is a readwrite property. Much safer than dealing with existing view hierarchy in the existing root view controller or using view controller containment in a "base" root view controller.
– Marc Etcheverry
Nov 23 '18 at 3:15
@matt I see nothing in the documentation stating that changing the root view controller of a window is discouraged, it is a readwrite property. Much safer than dealing with existing view hierarchy in the existing root view controller or using view controller containment in a "base" root view controller.
– Marc Etcheverry
Nov 23 '18 at 3:15
@E.Coms Thank you, that is right! I assume completion is called even if there aren't any modals presented. Otherwise you would need a check on
presentedViewController
, I will do some testing later– Marc Etcheverry
Nov 23 '18 at 3:17
@E.Coms Thank you, that is right! I assume completion is called even if there aren't any modals presented. Otherwise you would need a check on
presentedViewController
, I will do some testing later– Marc Etcheverry
Nov 23 '18 at 3:17
I disagree obviously.
– matt
Nov 23 '18 at 3:44
I disagree obviously.
– matt
Nov 23 '18 at 3:44
|
show 4 more comments
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53421089%2fswapping-rootviewcontroller-on-uiwindow-does-not-deallocate-view-controller%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown