我有一个警报风格的视图,我想在当前视图的前面推送,但我需要对当前视图的引用,以便我可以调用这两行:
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叠加在当前显示的视图之上。
答案 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
答案 2 :(得分:1)
“在iOS中获取原生视图”的答案表明它取决于您的应用程序的设置方式。在他的示例中,他恰好在“viewController”中拥有最顶层视图控制器的句柄,因此您需要构建代码以使其工作方式相同。
对于iOS 5,推荐的方法是让您的启动代码在您的密钥窗口上设置“RootViewController”属性,这样您就可以通过这种方式访问您的顶级视图控制器。
但一般情况下,如果要显示警报,可以使警报代码的API将当前视图控制器作为参数,例如:
void Alert (UIViewController myHost) {...}
答案 3 :(得分:0)
我建议创建一个单例类(可能称之为“ScreenManager”),它的唯一目的是保存对相关视图的引用并管理它们的外观。这样,每次推送/添加新视图时,都可以保留对它的引用,然后在添加此新警报视图时,可以通过在ScreenManager上调用公共方法来执行所有与视图相关的操作。希望这有助于您入门。