mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Fix Alert not showing in an app using UIScene (#34562)
Summary: In an app using `UIScene`, `Alert` no longer pops up because the window that gets created are not attached to a scene. ## Changelog [iOS] [Fixed] - Fix `Alert` not showing in an app using `UIScene` Pull Request resolved: https://github.com/facebook/react-native/pull/34562 Test Plan: Use the test plan in https://github.com/facebook/react-native/issues/29295. This should not regress that fix. Reviewed By: cipolleschi Differential Revision: D39276976 Pulled By: lunaleaps fbshipit-source-id: e48e985ed4abec77d6f01a6c17292d664ed88f13
This commit is contained in:
committed by
Facebook GitHub Bot
parent
b2452ab216
commit
153aedce41
@@ -10,6 +10,5 @@
|
||||
@interface RCTAlertController : UIAlertController
|
||||
|
||||
- (void)show:(BOOL)animated completion:(void (^)(void))completion;
|
||||
- (void)hide;
|
||||
|
||||
@end
|
||||
|
||||
@@ -9,24 +9,8 @@
|
||||
|
||||
#import <React/RCTAlertController.h>
|
||||
|
||||
@interface RCTAlertController ()
|
||||
|
||||
@property (nonatomic, strong) UIWindow *alertWindow;
|
||||
|
||||
@end
|
||||
|
||||
@implementation RCTAlertController
|
||||
|
||||
- (UIWindow *)alertWindow
|
||||
{
|
||||
if (_alertWindow == nil) {
|
||||
_alertWindow = [[UIWindow alloc] initWithFrame:RCTSharedApplication().keyWindow.bounds];
|
||||
_alertWindow.rootViewController = [UIViewController new];
|
||||
_alertWindow.windowLevel = UIWindowLevelAlert + 1;
|
||||
}
|
||||
return _alertWindow;
|
||||
}
|
||||
|
||||
- (void)show:(BOOL)animated completion:(void (^)(void))completion
|
||||
{
|
||||
if (@available(iOS 13.0, *)) {
|
||||
@@ -34,19 +18,7 @@
|
||||
RCTSharedApplication().delegate.window.overrideUserInterfaceStyle ?: UIUserInterfaceStyleUnspecified;
|
||||
self.overrideUserInterfaceStyle = style;
|
||||
}
|
||||
[self.alertWindow makeKeyAndVisible];
|
||||
[self.alertWindow.rootViewController presentViewController:self animated:animated completion:completion];
|
||||
}
|
||||
|
||||
- (void)hide
|
||||
{
|
||||
[_alertWindow setHidden:YES];
|
||||
|
||||
if (@available(iOS 13, *)) {
|
||||
_alertWindow.windowScene = nil;
|
||||
}
|
||||
|
||||
_alertWindow = nil;
|
||||
[[RCTKeyWindow() rootViewController] presentViewController:self animated:animated completion:completion];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -185,7 +185,6 @@ RCT_EXPORT_METHOD(alertWithArgs : (JS::NativeAlertManager::Args &)args callback
|
||||
case RCTAlertViewStylePlainTextInput:
|
||||
case RCTAlertViewStyleSecureTextInput:
|
||||
callback(@[ buttonKey, [weakAlertController.textFields.firstObject text] ]);
|
||||
[weakAlertController hide];
|
||||
break;
|
||||
case RCTAlertViewStyleLoginAndPasswordInput: {
|
||||
NSDictionary<NSString *, NSString *> *loginCredentials = @{
|
||||
@@ -193,12 +192,10 @@ RCT_EXPORT_METHOD(alertWithArgs : (JS::NativeAlertManager::Args &)args callback
|
||||
@"password" : [weakAlertController.textFields.lastObject text]
|
||||
};
|
||||
callback(@[ buttonKey, loginCredentials ]);
|
||||
[weakAlertController hide];
|
||||
break;
|
||||
}
|
||||
case RCTAlertViewStyleDefault:
|
||||
callback(@[ buttonKey ]);
|
||||
[weakAlertController hide];
|
||||
break;
|
||||
}
|
||||
}];
|
||||
|
||||
Reference in New Issue
Block a user