2016-06-30 39 views
1

Wenn ich eine Warnung mit UIAlertController zeige, wird die Warnung selbst in einem neuen Fenster angezeigt. (zumindest jetzt) ​​Und wenn das Alarmfenster ausgeblendet wird, scheint das System ein zufälliges Fenster-Schlüsselfenster zu setzen.Wie verhindert man, dass ein UIWindow ein Schlüsselfenster ist?

Ich präsentiere ein neues "Banner" -Fenster, um einige Banner über die Statusleiste zu rendern (AppStore-Kompatibilität ist hier nicht verfügbar), und normalerweise wird dieses "Banner" -Fenster zum nächsten Schlüsselfenster und verursacht viele Probleme beim Benutzer Eingabe und First-Responder-Management.

Also, ich möchte verhindern, dass dieses "Banner" -Fenster ein Schlüsselfenster wird, aber ich kann nicht herausfinden, wie. Für den Moment, als Workaround, setze ich gerade mein Hauptfenster wieder als Schlüsselfenster ein, sobald dieses "Banner" -Fenster zum Schlüsselfenster wird. Aber es fühlt sich nicht wirklich gut an.

Wie kann ich verhindern, dass ein Fenster ein Schlüsselfenster wird?

Antwort

0

Als Workaround können wir den Hauptfensterschlüssel erneut einstellen, sobald das "Banner" -Fenster zu einem Schlüssel wie diesem wird.

class BannerWindow: UIWindow { 
    weak var mainWindow: UIWindow? 
    override func becomeKeyWindow() { 
     super.becomeKeyWindow() 
     mainWindow?.makeKeyWindow() 
    } 
} 
0

Ich habe versucht, dieses Problem seit Jahren zu lösen. Ich berichtete schließlich einen Radar für sich: http://www.openradar.me/30064691

Meine Abhilfe etwa wie folgt aussieht:

// a UIWindow subclass that I use for my overlay windows 
@implementation GFStatusLevelWindow 

... 

#pragma mark - Never become key 
// http://www.openradar.me/30064691 

// these don't actually help 
- (BOOL)canBecomeFirstResponder 
{ 
    return NO; 
} 

- (BOOL)becomeFirstResponder 
{ 
    return NO; 
} 


- (void)becomeKeyWindow 
{ 
    LookbackStatusWindowBecameKey(self, @"become key window"); 
    [[self class] findAndSetSuitableKeyWindow]; 
} 

- (void)makeKeyWindow 
{ 
    LookbackStatusWindowBecameKey(self, @"make key window"); 
} 

- (void)makeKeyAndVisible 
{ 
    LookbackStatusWindowBecameKey(self, @"make key and visible window"); 
} 

#pragma mark - Private API overrides for status bar appearance 

// http://www.openradar.me/15573442 
- (BOOL)_canAffectStatusBarAppearance 
{ 
    return NO; 
} 

#pragma mark - Finding better key windows 

static BOOL IsAllowedKeyWindow(UIWindow *window) 
{ 
    NSString *className = [[window class] description]; 
    if([className isEqual:@"_GFRecordingIndicatorWindow"]) 
     return NO; 
    if([className isEqual:@"UIRemoteKeyboardWindow"]) 
     return NO; 
    if([window isKindOfClass:[GFStatusLevelWindow class]]) 
     return NO; 

    return YES; 
} 

void LookbackStatusWindowBecameKey(GFStatusLevelWindow *self, NSString *where) 
{ 
     GFLog(GFError, @"This window should never be key window!! %@ when in %@", self, where); 
     GFLog(GFError, @"To developer of %@: This is likely a bug in UIKit. If you can get a stack trace at this point (by setting a breakpoint at LookbackStatusWindowBecameKey) and sending that stack trace to [email protected] or [email protected], I will report it to Apple, and there will be rainbows, unicorns and a happier world for all :) thanks!", [[NSBundle mainBundle] gf_displayName]); 
} 

+ (UIWindow*)suitableWindowToMakeKeyExcluding:(UIWindow*)notThis 
{ 
    NSArray *windows = [UIApplication sharedApplication].windows; 
    NSInteger index = windows.count-1; 

    UIWindow *nextWindow = [windows objectAtIndex:index]; 
    while((!IsAllowedKeyWindow(nextWindow) || nextWindow == notThis) && index >= 0) { 
     nextWindow = windows[--index]; 
    } 
    return nextWindow; 
} 

+ (UIWindow*)findAndSetSuitableKeyWindow 
{ 

    UIWindow *nextWindow = [[self class] suitableWindowToMakeKeyExcluding:nil]; 
    GFLog(GFError, @"Choosing this as key window instead: %@", nextWindow); 
    [nextWindow makeKeyWindow]; 
    return nextWindow; 
}