2012-01-10 61 views
1

我是Monotouch的新手,并试图了解一些基本知识如何结合在一起。希望有人在那里能够提供帮助。MonoTouch中缺少对导航控制器的引用

我在Xamarin网站基于Multi-Screened Apps教程的MonoDevelop中创建了一个测试项目,并将其扩展为包含tableView。我在查看导航控制器时遇到了问题,我需要将详细视图推入,以通过附件按钮显示在表格中点击的项目的详细信息。我知道一些编码是非常糟糕的,只是试图让它在这个阶段工作,而不是代码的清晰度! (我正在使用Lion上的所有Mono工具/库等和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); 
} 

我从我读过到目前为止,这个基准应可通过从根视图控制器/ NavigationController发起,而不需要通过不同的视图通过从AppDelegate中引用的所有视图NavigationControllers的理解构造函数?

任何人都可以告诉我我可能会在这里失踪吗?

在此先感谢。

**回顾杰森的评论之后的更新:(请让我知道,如果这是张贴更新不正确的方式),所以

,我试过如下:

我救了一个参考NavigationController在包含表视图如下的构造函数的ViewController:

public partial class OrderList : UIViewController 
{  
    UINavigationController navController; 

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

然后通过了进入TableViewDelegate,其中AccessoryButtonTapped的处理,在viewDidLoad方法。

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

    base.ViewDidLoad(); 
} 

然后引用,在TableViewDelegate:

navController.PushViewController(detailScreen, true); 

public class OrdersTableViewDelegate : UITableViewDelegate 
{ 
    UINavigationController navController; 

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

    // Rest of class definition 
} 

然后,使用navController到NavigationController基准与如先前使用在AccessoryButtonTapped方法下面描述的代码编译

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

干杯

回答

0

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

+0

我已根据您的评论更新了一些附加代码的问题。 – Tiran 2012-01-10 23:45:28

+0

我的头顶,看起来是正确的。如果您将邮件发送到MT列表([email protected]),我会回复,我们可以在离线详细讨论。 – Jason 2012-01-11 03:18:39

+0

谢谢 - 发送电子邮件。 – Tiran 2012-01-11 10:38:47