Skip to content

Commit

Permalink
Fix Alert not showing in an app using UIScene (#34562)
Browse files Browse the repository at this point in the history
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: #34562

Test Plan: Use the test plan in #29295. This should not regress that fix.

Reviewed By: cipolleschi

Differential Revision: D39276976

Pulled By: lunaleaps

fbshipit-source-id: e48e985ed4abec77d6f01a6c17292d664ed88f13
  • Loading branch information
tido64 authored and facebook-github-bot committed Sep 8, 2022
1 parent b2452ab commit 153aedc
Show file tree
Hide file tree
Showing 3 changed files with 1 addition and 33 deletions.
1 change: 0 additions & 1 deletion React/CoreModules/RCTAlertController.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,5 @@
@interface RCTAlertController : UIAlertController

- (void)show:(BOOL)animated completion:(void (^)(void))completion;
- (void)hide;

@end
30 changes: 1 addition & 29 deletions React/CoreModules/RCTAlertController.m
Original file line number Diff line number Diff line change
Expand Up @@ -9,44 +9,16 @@

#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, *)) {
UIUserInterfaceStyle style =
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
3 changes: 0 additions & 3 deletions React/CoreModules/RCTAlertManager.mm
Original file line number Diff line number Diff line change
Expand Up @@ -185,20 +185,17 @@ - (void)invalidate
case RCTAlertViewStylePlainTextInput:
case RCTAlertViewStyleSecureTextInput:
callback(@[ buttonKey, [weakAlertController.textFields.firstObject text] ]);
[weakAlertController hide];
break;
case RCTAlertViewStyleLoginAndPasswordInput: {
NSDictionary<NSString *, NSString *> *loginCredentials = @{
@"login" : [weakAlertController.textFields.firstObject text],
@"password" : [weakAlertController.textFields.lastObject text]
};
callback(@[ buttonKey, loginCredentials ]);
[weakAlertController hide];
break;
}
case RCTAlertViewStyleDefault:
callback(@[ buttonKey ]);
[weakAlertController hide];
break;
}
}];
Expand Down

0 comments on commit 153aedc

Please sign in to comment.