获取对 UINavigationController 的引用

Posted

技术标签:

【中文标题】获取对 UINavigationController 的引用【英文标题】:Get reference to UINavigationController 【发布时间】:2012-11-13 20:54:16 【问题描述】:

我在UINavigationController 上推送了一个根控制器。 在该根控制器类中,我可以使用this.NavigationController 访问UINavigationController

但是,这个根控制器有一个 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 对象传递给我的所有类(构造函数中的参数),但这可能不是最干净的方法。

【问题讨论】:

我对monotouch不熟悉,但是你必须先设置rootViewController,而不是push它。 【参考方案1】:

为了扩展 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 的属性。

希望这会有所帮助。

【讨论】:

【参考方案2】:

UIApplicationDelegate 本身并没有定义navigationController 属性。

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

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

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

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

【讨论】:

以上是关于获取对 UINavigationController 的引用的主要内容,如果未能解决你的问题,请参考以下文章

将 managedObjectContext 发送到 viewController 崩溃

如何正确关闭作为模式呈现的 UINavigationController?

ID:[...] 的 NSManagedObject 已失效

在 UINavigationController 中设置时图像不显示

UINavigationController - 何时释放推送的视图控制器等

使用 UINavigationController 从另一个控制器更新或重新加载 UIViewController?