MonoTouch:UITableViewController,NavigationController在NavigationController.PushViewController之后为null

时间:2011-05-01 20:42:12

标签: ios uinavigationcontroller xamarin.ios

我正在使用以下策略构建基于窗口(所有UI编程连接,无IB)的MonoTouch应用程序:

伪代码:

 Note: I'm not calling base.ViewDidLoad on any of the ViewDidLoad calls, 
 nor calling any base constructors of any ViewController 
 subclass I've implemented. 

 AppDelegate : UIApplicationDelegate
      FinishedLaunching() 
             window.AddSubView(tabbarController.View)

 TabbarController : UITabbarController
       ViewDidLoad() 
              ViewControllers[0] = myNavigationController

 MyNavigationController : UINavigationController
       ViewDidLoad()
             PushViewController(myTableViewController,false)

 MyTableViewController : UITableViewController
        ViewDidLoad() 
             //Property NavigationController is NULL.

根据developer.apple.com,应该使用名为initWithRootController的ObjC init方法创建NavigationControllers,但我找不到任何相同的MonoTouch。

参考http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/TableView_iPhone/TableViewAndDataModel/TableViewAndDataModel.html

MyNavigationControllers PushViewController方法不应该自动分配MyTableViewController实例的NavigationController属性吗? 为了让这种自动装配进行,我可能还有什么遗漏?

其他一切都按预期工作。非常感谢MT团队! :)

谢谢!

1 个答案:

答案 0 :(得分:0)

当您创建myNavigationController的实例时,您是如何做到的?我相信initWithRootController的C#等价物是:

UINavigationController navController = new UINavigationController(rootViewController);

要在自定义UINavigationController中实现此功能,您必须创建一个新的构造函数:

MyNavigationController(UIViewController rootViewController)
{
    ViewControllers = new UIViewController[1] { rootViewController };
}

这将为您设置rootViewController。您需要从PushViewController方法中删除ViewDidLoad。通过PushViewController推送的任何后续ViewControllers都会自动为您设置此NavigationController属性。