我是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。我在错误的地方或顺序做某事吗?
干杯
答案 0 :(得分:0)
NavigationController属性位于表的视图控制器上。如果您尝试从表的数据源引用它,则需要在创建数据源时传递对控制器的引用。