1

我有一个警报样式的视图,我想将它推到当前视图的前面,但是我需要对当前视图的引用,以便我可以调用这两行:

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

4 回答 4

2

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

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

UIView currentView = currentController.View;

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

于 2012-06-23T22:03:19.800 回答
1

如果您的视图显示在 aUINavigationController中,则可以在任何控制器中使用:

this.NavigationController.TopViewController.View

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

this.PresentedViewController.View

但是,@stavash 的方法适用于其他情况。

于 2012-06-23T14:49:50.947 回答
1

“在 iOS 中获取本机视图”的答案表明这取决于您的应用程序的设置方式。在他的示例中,他碰巧拥有“viewController”中最顶层视图控制器的句柄,因此您需要将代码构造为相同的方式才能使其工作。

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

但一般来说,如果你想显示警报,可以让警报代码的 API 将当前视图控制器作为参数,例如:

void Alert (UIViewController myHost) {...}
于 2012-06-23T17:25:48.577 回答
0

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

于 2012-06-23T05:38:58.567 回答