2010-12-28 11 views
27

Myślałem, że to było łatwe jak [myWindow resignKeyWindow] i [self.window makeKeyAndVisible], ale chyba nie ... Czy wiedzielibyście, co robić?Jak usunąć UIWindow?

Dzięki :)

+0

można wyjaśnić/opracować trochę więcej co masz do września? Ponieważ pytanie nie jest zbyt jasne. Może się mylę. –

Odpowiedz

13

Nie wywoływać -resignKeyWindow bezpośrednio, to miała być zastąpiona wykonanie kodu, gdy UIWindows zostanie usunięty. Aby usunąć stare okno, musisz utworzyć nową instancję UIWindow i ustawić ją jako -makeKeyAndVisible, stare okno zrezygnuje ze statusu klucza. W systemie iOS 4 nawet nie będzie zbierać starego, starego, UIWindow, o ile nie masz żadnych odniesień do niego. Wykonanie tego w iOS 3.x może mieć katastrofalne skutki. Ostrzeżony.

+5

To rzeczywiście zmienia okno, które jest keyWindow, ale nie wydaje się być usunięcie go z aplikacji.windows .... – samvermette

+0

Podgląd niestandardowy okna jest zerowy. Po prostu ustaw to ukryte na NIE – tristan

+0

to odpowiedź poniżej (z Nikolai Ruhe) mówi ci, jak faktycznie usunąć okno –

-8

Mam ten sam problem, może to pomóc.

Musisz zniszczyć wszystkie silne ref przed usunięciem i dealloc okna, szczególnie rootWindowController. Myślę, że poniżej kod wystarczy usunąć dowolny element okna:

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

Jak wspomniano w niektórych innych postach, nie powinieneś bezpośrednio wywoływać 'resignKeyWindow'. – ThomasW

64

Prawidłowy sposób ukryć okno jest ustawić właściwość hidden na TAK. Aby usunąć ją z właściwości UIApplication o wartości windows, właśnie zwolniłeś okno (w ARC ustawiasz wszystkie odniesienia do zera).

Oczywiście w tym momencie potrzebne jest inne okno.

+3

Nic nie działało dla mnie w ARC. – NightFury

+0

To jest prawdziwa poprawna droga. – Leo

0

Nie można usunąć okna z Delegata aplikacji. Można jednak usunąć utworzone niestandardowe okna.

Aby usunąć okno, należy najpierw dostarczyć zamiennik. Otrzymujemy domyślne okno.

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

Mamy teraz dostęp do domyślnego okna według właściwości appdelegate.window.

Teraz zdobądź oryginalny lub niestandardowy kontroler nawigacyjny. Przypisanie siebie jako kontrolera rootview.

Wywołanie makekeyandvisible usuwa wszystkie okna i przypisuje okno appdelegates jako okno kluczowe. Ustaw rootViewController jako właśnie utworzony NavigationController, a Ty jesteś gotowy do pracy!

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

Dziękuję!

0

Jeśli masz jakieś inne niż okno aplikacji okna, użyj go ..

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