Я новичок в Monotouch и пытаюсь понять, как некоторые из них объединяются. Надеюсь, кто-то там сможет помочь.Отсутствует ссылка на навигационный контроллер в Monotouch
Я создал тестовый проект в MonoDevelop на основе учебника Multi-Screened Apps на сайте Xamarin и расширил его, включив в него tableView. У меня возникли проблемы со ссылкой на контроллер навигации в представлении, которое мне нужно для точного просмотра детали, чтобы отобразить деталь элемента, постукиваемого в таблице, с помощью кнопки аксессуара. Я знаю, что некоторая кодировка лохматая, просто пыталась заставить ее работать на этом этапе, а не ясность в коде! (Я использую последние версии всех инструментов/библиотек Mono и т. Д. И XCode 4 на Lion). Начиная с самого начала, вот код в FinishedLaunching в AppDelegate.
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 через различные точки зрения конструкторы?
Может ли кто-нибудь сказать мне, что мне здесь не хватает?
Заранее благодарен.
** Обновление после рассмотрения комментария Джейсона: (Пожалуйста, дайте мне знать, если это неправильный способ размещать обновления)
Итак, я попытался следующее:
я сохранил ссылку на 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:
public class OrdersTableViewDelegate : UITableViewDelegate
{
UINavigationController navController;
public OrdersTableViewDelegate(UINavigationController controller)
{
navController = controller;
}
// Rest of class definition
}
Тогда ссылка на NavigationController использованием NavController компилирует с кодом, как описано ранее с использованием следующего в методе AccessoryButtonTapped:
navController.PushViewController(detailScreen, true);
Когда я запускаю это и нажимаю на AccessoryButton, я получаю исключение нулевой ссылки на navController. Ссылка на this.NavigationController в конструкторе ViewController имеет значение null. Я что-то делаю в неправильном месте или последовательности?
Приветствия
Я обновил свой вопрос с помощью дополнительного кода на основе вашего комментария. – Tiran
с верхней части головы, что выглядит правильно. Если вы отправляете почту в список MT ([email protected]), я отвечу, и мы можем подробно обсудить офлайн. – Jason
Спасибо, отправлено письмо. – Tiran