Monotouch中缺少对导航控制器的引用

时间:2012-01-10 03:08:38

标签: xamarin.ios

我是Monotouch的新手,并试图了解一些基础知识是如何结合在一起的。希望那里的人能够提供帮助。

我已经在MonoDevelop上基于Xamarin网站上的Multi-Screened Apps教程创建了一个测试项目,并将其扩展为包含tableView。我在视图中引用导航控制器时遇到问题,我需要将详细视图推到上面,以显示通过附件按钮在表格中点击的项目的详细信息。我知道有些编码很糟糕,只是试图让它在这个阶段工作而不是代码的清晰度! (我正在使用所有Mono工具/库等的最新版本和Lion上的XCode 4)。从头开始这里是AppDelegate中FinishedLaunching中的代码。

window = new UIWindow (UIScreen.MainScreen.Bounds);
this.rootNavigationController = new UINavigationController();
// Create a new homescreen
HomeScreen homeScreen = new HomeScreen();
// Add the homescreen to the root navigation controller
this.rootNavigationController.PushViewController(homeScreen, false);
// Set the root view controller on the window - the navigation controller
// will handle the rest.
this.window.RootViewController = this.rootNavigationController;
// make the window visible
this.window.MakeKeyAndVisible ();

homeScreen只包含一个按钮,用于加载包含表视图(OrderList)的新视图。这是按钮事件处理程序。

void HandleOrdersButtonhandleTouchUpInside (object sender, EventArgs e)
{
    if (orderListScreen == null)
        orderListScreen = new OrderList();
    NavigationController.PushViewController(orderListScreen, true);
} 

一切正常。我有一些虚拟数据加载到表视图中,也可以正常工作。 OrderData是一个简单的测试类,它只包含几个属性。我已经向单元格添加了一个AccessoryButton,并且在点击时会尝试加载详细信息视图。这是执行此操作的代码 - 在代码中注释问题! (我之前测试过AccessoryButtonTapped功能,只是显示一个警报)。

public override void AccessoryButtonTapped (UITableView tableView, NSIndexPath indexPath)
{
    var dataSource = (OrdersTableViewDataSource)tableView.DataSource;
    if (detailScreen == null)
        detailScreen = new OrderDetailScreen();
    OrderData theOrder = dataSource.OrdersData[indexPath.Row];
    detailScreen.currentOrder = theOrder;

    // Cant get a reference to NavigationController here to push the detail view!
    // this.NavigationController is not available
    this.NavigationController.PushViewController(detailScreen, true);
}

我从目前读到的内容中对NavigationControllers的理解是,这个引用应该可以通过源ViewController / NavigationController的所有视图获得,而不需要通过各种视图构造函数传递AppDelegate的引用吗?

谁能告诉我这里可能缺少什么?

提前致谢。

**在审核Jason的评论后的更新:(如果这是发布更新的错误方式,请告诉我)

所以,我尝试了以下内容:

我在包含表视图的ViewController的构造函数中保存了对NavigationController的引用,如下所示:

public partial class OrderList : UIViewController
{       
    UINavigationController navController;

    public OrderList () : base ("OrderList", null)
    {
        this.Title = "Orders";
        navController = this.NavigationController;
    }

然后将其传递到TableViewDelegate,在ViewDidLoad方法中处理AccessoryButtonTapped。

public override void ViewDidLoad ()
{
    orderTableView.DataSource = new OrdersTableViewDataSource();
    orderTableView.Delegate = new OrdersTableViewDelegate(navController);

    base.ViewDidLoad ();
}

然后在TableViewDelegate中引用它:

public class OrdersTableViewDelegate : UITableViewDelegate
{
    UINavigationController navController;

    public OrdersTableViewDelegate(UINavigationController controller)
    {
        navController = controller;
    }

    // Rest of class definition
}

然后使用navController对NavigationController的引用使用AccessoryButtonTapped方法中的以下内容编译,如前所述:

navController.PushViewController(detailScreen, true);

当我运行它并点击AccessoryButton时,我在navController上得到一个空引用异常。 ViewController构造函数中对this.NavigationController的引用为null。我在错误的地方或顺序做某事吗?

干杯

1 个答案:

答案 0 :(得分:0)

NavigationController属性位于表的视图控制器上。如果您尝试从表的数据源引用它,则需要在创建数据源时传递对控制器的引用。