Skip to content

Commit 72d47a5

Browse files
committed
feat: expose get_top_view_controller
1 parent e1e0f76 commit 72d47a5

1 file changed

Lines changed: 22 additions & 13 deletions

File tree

src/backend/ios.rs

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::{
66
};
77

88
use block2::StackBlock;
9-
use objc2::MainThreadMarker;
9+
use objc2::{MainThreadMarker, rc::Retained};
1010
use objc2_core_foundation::{CGFloat, CGRect, CGSize};
1111
use objc2_foundation::{NSArray, NSObjectNSKeyValueCoding, NSRange, NSString, ns_string};
1212
use 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

Comments
 (0)