Я создаю свое первое приложение, используя MonoTouch.Это довольно простое приложение, которое ищет код из базы данных sqlite и отображает различные значения для кода в разных представлениях.Я использовал Interface Builder.Мой вопрос касается правильного способа загрузки nib-файла.
Мои пользовательские контроллеры табличного представления сконструированы так:
public partial class HAZARDTableViewController : UITableViewController
{
#region Constructors
// The IntPtr and initWithCoder constructors are required for items that need
// to be able to be created from a xib rather than from managed code
public HAZARDTableViewController (IntPtr handle) : base (handle)
{
}
[Export ("initWithCoder:")]
public HAZARDTableViewController (NSCoder coder) : base (coder)
{
Initialize ();
}
public HAZARDTableViewController ()
{
Console.WriteLine("HAZARDTableViewController():Constructor");
Initialize ();
}
В файле .designer.cs:
public partial class HAZARDTableViewController : UITableViewController
{
#region Constructors
//The IntPtr and initWithCoder constructors are required for items that need
// to be able to be created from a xib rather than from managed code
public HAZARDTableViewController (IntPtr handle) : base (handle)
{
}
[Export ("initWithCoder:")]
public HAZARDTableViewController (NSCoder coder) : base (coder)
{
Initialize ();
}
public HAZARDTableViewController () //: base ("HAZARDTableViewController", null)
{
Console.WriteLine("HAZARDTableViewController():Constructor");
Initialize ();
}
[MonoTouch.Foundation.Register("HAZARDTableViewController")]
public partial class HAZARDTableViewController {
private MonoTouch.UIKit.UIView __mt_view;
private MonoTouch.UIKit.UITableView __mt_tableView;
#pragma warning disable 0169
[MonoTouch.Foundation.Connect("view")]
private MonoTouch.UIKit.UIView view
{
get {
this.__mt_view = ((MonoTouch.UIKit.UIView)(this.GetNativeField("view")));
return this.__mt_view;
}
set {
this.__mt_view = value;
this.SetNativeField("view", value);
}
}
[MonoTouch.Foundation.Connect("tableView")]
private MonoTouch.UIKit.UITableView tableView {
get {
this.__mt_tableView = ((MonoTouch.UIKit.UITableView)(this.GetNativeField("tableView")));
return this.__mt_tableView;
}
set {
this.__mt_tableView = value;
this.SetNativeField("tableView", value);
}
}
Одна из вещей, на которые я смотрю, это то, как пользовательские контроллеры табличного представления загружают файлы пера.Насколько я понимаю, этот конструктор следует использовать:
public HAZARDTableViewController () : base ("HAZARDTableViewController", null)
Это приводит к следующему исключению:
Необработанное исключение: MonoTouch.Foundation.MonoTouchException: брошено исключение Objective-C.Имя: NSInternalInconsistencyException Причина: - [UITableViewController loadView] загрузил перо «HAZARDTableViewController», но не получил UITableView.
Я также пробовал этот конструктор, как было предложено Брайаном Костаничем в его замечательных урокахзагрузить перо синхронно.
MonoTouch.Foundation.NSBundle.MainBundle.LoadNib ("HAZARDTableViewController", this, null); ViewDidLoad();
Это приводит к исключению нулевой ссылки, когда код ссылается на TableView
в ViewDidLoad
.(Кстати, я пробовал использовать tableView
вместо TableView
.)
Я также пробовал этот конструктор в соответствии с документацией Xamarin:
public HAZARDTableViewController (string nibName, NSBundle bundle) : base(nibName, bundle) {
Initialize();
}
Что приводит к:
Необработанное исключение: MonoTouch.Foundation.MonoTouchException: брошено исключение Objective C.Имя: NSInternalInconsistencyException Причина: - [UITableViewController loadView] загрузил перо «HAZARDTableViewController», но не получило UITableView.
Это работает, когда я просто создаю свой собственный конструктор, не пытаясь загрузить свой кончик.
public HAZARDTableViewController ()
{
Console.WriteLine("HAZARDTableViewController():Constructor");
Initialize ();
}
Я не понимаю, как это работает без специальной загрузки пера.Меня беспокоит то, что мое приложение падает примерно через 6 или 7 минут использования.Я пропустил это через инструменты, и это наполняет память.Я очистил списки и искал свободные ссылки.Во всяком случае, это для другого вопроса.Я просматриваю свой код с помощью хорошего гребня, и мне интересно, правильно ли я загружаю свой файл пера, возможно, он неправильно высвобождает ресурсы пера?Для меня IB - это чёрный ящик.
Итак, подведя итог, я хотел бы знать: 1. Как правильно загружать перо?2. Почему вышеупомянутые попытки не работают?3. Может ли это быть причиной утечки памяти или я смотрю не в том месте?