@@ -6,7 +6,7 @@ use std::{
66} ;
77
88use block2:: StackBlock ;
9- use objc2:: MainThreadMarker ;
9+ use objc2:: { MainThreadMarker , rc :: Retained } ;
1010use objc2_core_foundation:: { CGFloat , CGRect , CGSize } ;
1111use objc2_foundation:: { NSArray , NSObjectNSKeyValueCoding , NSRange , NSString , ns_string} ;
1212use objc2_ui_kit:: {
@@ -198,20 +198,29 @@ impl Backend for IOS {
198198 ) ;
199199 alert. addAction ( & ok_action) ;
200200
201- let key_window = UIApplication :: sharedApplication ( mtm)
202- . connectedScenes ( )
203- . iter ( )
204- . filter_map ( |scene| scene. downcast :: < UIWindowScene > ( ) . ok ( ) )
205- . find_map ( |scene| scene. keyWindow ( ) )
206- . ok_or_else ( || io:: Error :: other ( "no active window found" ) ) ?;
207- let mut top_vc = key_window
208- . rootViewController ( )
209- . ok_or_else ( || io:: Error :: other ( "no root ViewController found for key window" ) ) ?;
210- while let Some ( presented) = top_vc. presentedViewController ( ) {
211- top_vc = presented;
212- }
201+ let top_vc = get_top_view_controller ( mtm) . ok_or_else ( || {
202+ io:: Error :: other (
203+ "no active window or view controller found to present the input dialog" ,
204+ )
205+ } ) ?;
213206 top_vc. presentViewController_animated_completion ( & alert, true , None ) ;
214207
215208 Ok ( ( ) )
216209 }
217210}
211+
212+ /// Helper function to get the topmost view controller for presenting the alert.
213+ ///
214+ /// Returns `None` if no active window or view controller is found.
215+ pub fn get_top_view_controller ( mtm : MainThreadMarker ) -> Option < Retained < UIViewController > > {
216+ let key_window = UIApplication :: sharedApplication ( mtm)
217+ . connectedScenes ( )
218+ . iter ( )
219+ . filter_map ( |scene| scene. downcast :: < UIWindowScene > ( ) . ok ( ) )
220+ . find_map ( |scene| scene. keyWindow ( ) ) ?;
221+ let mut top_vc = key_window. rootViewController ( ) ?;
222+ while let Some ( presented) = top_vc. presentedViewController ( ) {
223+ top_vc = presented;
224+ }
225+ Some ( top_vc)
226+ }
0 commit comments