我是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。我在错误的地方或顺序上做了些什么?
干杯
我已根据您的评论更新了一些附加代码的问题。 – Tiran 2012-01-10 23:45:28
我的头顶,看起来是正确的。如果您将邮件发送到MT列表([email protected]),我会回复,我们可以在离线详细讨论。 – Jason 2012-01-11 03:18:39
谢谢 - 发送电子邮件。 – Tiran 2012-01-11 10:38:47