2012-01-10 3 views
1

Я новичок в 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. Я что-то делаю в неправильном месте или последовательности?

Приветствия

ответ

0

NavigationController свойство на контроллере представления вашей таблицы. Если вы пытаетесь ссылаться на него из источника данных вашей таблицы, вам необходимо передать ссылку на контроллер при создании источника данных.

+0

Я обновил свой вопрос с помощью дополнительного кода на основе вашего комментария. – Tiran

+0

с верхней части головы, что выглядит правильно. Если вы отправляете почту в список MT ([email protected]), я отвечу, и мы можем подробно обсудить офлайн. – Jason

+0

Спасибо, отправлено письмо. – Tiran

Смежные вопросы