2010-12-28 17 views
27

Ich dachte, es war einfach wie [myWindow resignKeyWindow] und [self.window makeKeyAndVisible] aber ich denke nicht ... Würdest du wissen, was zu tun ist?Wie entferne ich ein UIWindow?

Thanks :)

+0

Können Sie erklären/erarbeiten ein wenig mehr, was Sie bis zu sind? Da ist die Frage nicht zu klar. Vielleicht irre ich mich. –

Antwort

13

Sie nicht direkt aufrufen -resignKeyWindow wurde gemeint, außer Kraft gesetzt werden, einen Code auszuführen, wenn Ihr UIWindows entfernt wird. Um das alte Fenster zu entfernen, müssen Sie eine neue Instanz von UIWindow erstellen und es -makeKeyAndVisible machen, das alte Fenster wird seinen Schlüsselstatus zurücknehmen. In iOS 4 wird es sogar Müll sammeln Ihre alten UIWindow, vorausgesetzt, Sie haben keine Verweise darauf. Dies in iOS 3.x zu tun, hätte verheerende Auswirkungen. Ich warnte dich.

+5

Dies ändert in der Tat, welches Fenster das keyWindow ist, scheint es aber nicht von application.windows zu entfernen. – samvermette

+0

Die Superview von Custom Window ist null. Setze es einfach auf NO – tristan

+0

, das die Antwort unten (von Nikolai Ruhe) dir sagt, wie man ein Fenster tatsächlich entfernt –

-8

Ich habe das gleiche Problem, kann es helfen.

Sie müssen alle starken Ref vor dem Entfernen und Dealloc ein Fenster, vor allem die RootWindowController zerstören. Ich denke, Code unten genug ist, alle Fenster zu löschen:

[self.window.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
    self.window.rootViewController = nil; 
    [self.window resignKeyWindow]; 
    [self.window removeFromSuperview]; 
+4

Wie in einigen anderen Posts erwähnt, sollten Sie 'resignKeyWindow' nicht direkt aufrufen. – ThomasW

64

Der korrekte Weg, um ein Fenster zu verstecken ist die hidden Eigenschaft auf JA zu setzen. Um es aus der UIApplication-Eigenschaft windows zu entfernen, geben Sie einfach das Fenster frei (in ARC setzen Sie alle Referenzen auf null).

Natürlich möchten Sie zu diesem Zeitpunkt ein anderes Fenster haben.

+3

Making nil arbeitete für mich in ARC. – NightFury

+0

Dies ist der richtige Weg. – Leo

0

Sie können das Fenster nicht von App Delegate entfernen. Sie können jedoch alle erstellten benutzerdefinierten Fenster entfernen.

Um das Fenster zu entfernen, müssen Sie zuerst einen Ersatz bereitstellen. So erhalten wir das Standardfenster.

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

Wir haben jetzt Zugriff auf Standardfenster von appdelegate.window Eigenschaft.

Jetzt erhalten Sie die Original-oder Custom Navigation Controller. Weisen Sie self als rootviewcontroller zu.

Aufruf von makkeyandvisible entfernt alle Fenster und weist das Fenster appdelegates als Schlüsselfenster zu. Setze rootViewController als NavigationController, den du gerade erstellt hast, und du kannst loslegen!

DEMONavigationController *demoNav = [[DEMONavigationController alloc]initWithRootViewController:self]; 
[appDelegate.window makeKeyAndVisible]; 
appDelegate.window.rootViewController = demoNav; 

Vielen Dank!

0

Wenn Sie alle Fenster außer App Fenster haben, verwenden Sie es ..

let mainWindow = UIApplication.shared.delegate?.window 
mainWindow??.makeKeyAndVisible()