获取对 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 中设置时图像不显示