2016-06-30 55 views
1

UIAlertControllerでアラートを表示すると、アラート自体が新しいウィンドウに表示されます。 (今は少なくとも)警告ウィンドウが消えると、システムはランダムなウィンドウキーウィンドウを設定しているように見えます。UIWindowをキーウィンドウにする方法を教えてください。

私はステータスバー(AppStoreとの互換性はここではありません)にいくつかのバナーをレンダリングするための新しい「バナー」ウィンドウを提示しています。通常、この「バナー」ウィンドウは次のキーウィンドウになり、入力および第1応答者管理を含む。

この「バナー」ウィンドウがキーウィンドウにならないようにしたいのですが、どのようにして把握できないのですか。現時点では、回避策として、「バナー」ウィンドウがキーウィンドウになるとすぐにメインウィンドウを再びキーウィンドウに設定し直しています。しかし、それは本当に良い気分ではありません。

どのようにしてウィンドウがキーウィンドウになるのを防ぐことができますか?

答えて

0

回避策として、「バナー」ウィンドウがこのようなキーになるとすぐにメインウィンドウキーを再設定することができます。

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

私はこの問題を長年解決しようとしてきました。私は最終的にそれのためにレーダーを報告:

// 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; 
} 
http://www.openradar.me/30064691

私の問題を回避するには、次のようになります

関連する問題