3

我有一个 rootcontroller 推送到UINavigationController. 在那个 rootcontroller 类中,我可以访问UINavigationControllerwiththis.NavigationController

但是,这个根控制器有一个 ScrollView,我正在向这个 ScrollView 添加子控制器(或更准确地说,这个子控制器的视图)。

我现在想从这样的子控制器内部访问 UINavigationController。以下属性均为空

        this.NavigationController
        this.ParentViewController
        this.PresentedViewController
        this.PresentingViewController

在ObjectiveC中您似乎可以使用以下代码

YourAppDelegate *del = (YourAppDelegate *)[UIApplication sharedApplication].delegate;
[del.navigationController pushViewController:nextViewController animated:YES];

不幸的是,我不知道如何将它映射到 MonoTouch 中的 C#。我尝试了以下方法,但它不起作用:

UIApplication.SharedApplication.KeyWindow.RootViewController.NavigationController

我知道我可以将 UINavigationController 对象传递给我的所有类(构造函数中的参数),但这可能不是最干净的方法。

4

2 回答 2

4

为了扩展 poupou 的答案,这是我通常在AppDelegate课堂上做的一个例子:

添加自身的静态属性AppDelegate

public static AppDelegate Self { get; private set; }

将我的根导航控制器添加为属性:

public UINavigationController MainNavController { get; private set; }

FinishedLaunching

Self = this;
window = new UIWindow(UIScreen.MainScreen.Bounds);
this.MainNavController = new UINavigationController(); // pass the nav controller's root controller in the constructor
window.RootViewController = this.MainNavController;
// ..

这样,我可以从任何地方访问根视图控制器,如下所示:

AppDelegate.Self.MainNavController.PushViewController(someViewController);

...而不是一直写这个:

AppDelegate myAppDelegate = (AppDelegate)UIApplication.SharedApplication.Delegate;
myAppDelegate.MainNavController.PushViewController(someViewController);

另外,我可以直接访问AppDelegate我可能拥有的所有其他属性。

希望这可以帮助。

于 2012-11-14T07:14:22.243 回答
2

UIApplicationDelegate本身并不定义navigationController属性。

OTOH[UIApplication sharedApplication].delegate返回您自己的、特定于应用程序的实例,UIApplicationDelegate因此它是分享东西的好地方(以及为什么经常使用它)。

在 ObjectiveC中,通常发生的是这种自定义的、UIApplicationDelegate衍生的类型将实现它自己的应用程序属性。IOWYourAppDelegate将实现一个navigationController可以在应用程序内的任何位置访问的属性,通过使用[UIApplication sharedApplication].delegate.

您可以在 .NET / C# 中执行非常类似的操作。只需将您自己的属性添加到您的 AppDelegate 类型,就像这个例子一样。您将能够像Objective-C(如果您愿意)或更直接地访问它们(例如,通过使它们成为public static属性)。

请注意,您仍然必须正确跟踪和设置属性(就像在 Objective-C 中也需要完成一样)。

于 2012-11-13T21:47:29.230 回答