如何在Monotouch中获取当前视图?

时间:2012-06-23 05:01:36

标签: ios uiview xamarin.ios

我有一个警报风格的视图,我想在当前视图的前面推送,但我需要对当前视图的引用,以便我可以调用这两行:

currentView.InsertSubviewAbove(myNewViewToShow, currentView);
currentView.BringSubviewToFront(myNewViewToShow);

那么如何获得对当前视图的引用?

我在此链接的底部看到了答案:Get active view in iOS

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
UIView *topView = appDelegate.viewController.view;

我试过这个:

((AppDelegate)UIApplication.SharedApplication.Delegate).ViewController.View

但据我所知,Monotouch appDelegate中没有'ViewController'属性。

我正在使用故事板和segues来控制我的程序流程。我有一个后台线程,它监视各种错误情况,并且需要在发生错误时将UIView叠加在当前显示的视图之上。

4 个答案:

答案 0 :(得分:2)

事实证明解决方案稍微复杂一点,所以为了清楚起见,我在这里发布了完整的解决方案。

UIViewController currentController = UIApplication.SharedAppplication.KeyWindow.RootViewController;
while (currentController.PresentedViewController != null)
    currentController = currentController.PresentedViewController;

UIView currentView = currentController.View;

基本上,有一个PresentedViewControllers树,您必须走到树的末尾才能看到哪一个在顶部。然后你就可以获得该控制器的视图。

答案 1 :(得分:1)

如果您的观看次数在UINavigationController内,则可以在任何控制器中使用:

this.NavigationController.TopViewController.View

如果您以模态方式呈现内容:

this.PresentedViewController.View

然而, @ stavash的方法适用于其他情况。

答案 2 :(得分:1)

“在iOS中获取原生视图”的答案表明它取决于您的应用程序的设置方式。在他的示例中,他恰好在“viewController”中拥有最顶层视图控制器的句柄,因此您需要构建代码以使其工作方式相同。

对于iOS 5,推荐的方法是让您的启动代码在您的密钥窗口上设置“RootViewController”属性,这样您就可以通过这种方式访问​​您的顶级视图控制器。

但一般情况下,如果要显示警报,可以使警报代码的API将当前视图控制器作为参数,例如:

void Alert (UIViewController myHost) {...}

答案 3 :(得分:0)

我建议创建一个单例类(可能称之为“ScreenManager”),它的唯一目的是保存对相关视图的引用并管理它们的外观。这样,每次推送/添加新视图时,都可以保留对它的引用,然后在添加此新警报视图时,可以通过在ScreenManager上调用公共方法来执行所有与视图相关的操作。希望这有助于您入门。