Monotouch - исключение нулевой ссылки на ячейку UITableview - PullRequest
0 голосов
/ 05 сентября 2011

Я создаю приложение, которое содержит UITableview.У меня теперь отлично работает таблица, теперь я хочу сделать клетки более специфичными для моих потребностей.Ячейка таблицы содержит изображение, заголовок, подзаголовок и информацию о выпуске.Я думал, что это было просто сделать, но я не могу заставить его работать.Я пытаюсь следовать примеру (и образцу) из монофонического программирования wrox Professional для iPhone (стр. 120 и 121), но не могу заставить его работать в моем случае.Я попытался перейти по этой ссылке и по этой ссылке , но безрезультатно.Во-вторых, я делаю одну вещь по-другому, это становится проблемой.

У меня есть некоторые из следующих файлов в моем проекте:

  • RootViewController (UITableViewController)
  • myTableViewCell (UITableViewCell)
  • BasicTableViewSource (UITableViewSource)

Примечание: у меня уже был RootViewController, но когда я создавал интерфейс для ячейки, я добавил частичный (для RootViewController) для добавленияячейка в.

Вот мои фрагменты кода:

myTableViewCell.xib.designer.cs

// Base type probably should be MonoTouch.UIKit.UIViewController or subclass
[MonoTouch.Foundation.Register("RootViewController")]
public partial class RootViewController {

    private myTableViewCell __mt_Cell;

    #pragma warning disable 0169
    [MonoTouch.Foundation.Connect("Cell")]
    private myTableViewCell Cell {
        get {
            this.__mt_Cell = ((myTableViewCell)(this.GetNativeField("Cell")));
            return this.__mt_Cell;
        }
        set {
            this.__mt_Cell = value;
            this.SetNativeField("Cell", value);
        }
    }
}

// Base type probably should be MonoTouch.UIKit.UITableViewCell or subclass
[MonoTouch.Foundation.Register("myTableViewCell")]
public partial class myTableViewCell {

    private MonoTouch.UIKit.UIImageView __mt_img;

    private MonoTouch.UIKit.UILabel __mt_lblInfo;

    private MonoTouch.UIKit.UILabel __mt_lblReleaseDate;

    private MonoTouch.UIKit.UILabel __mt_lblTitle;

    #pragma warning disable 0169
    [MonoTouch.Foundation.Connect("img")]
    private MonoTouch.UIKit.UIImageView img {
        get {
            this.__mt_img = ((MonoTouch.UIKit.UIImageView)(this.GetNativeField("img")));
            return this.__mt_img;
        }
        set {
            this.__mt_img = value;
            this.SetNativeField("img", value);
        }
    }

    [MonoTouch.Foundation.Connect("lblInfo")]
    private MonoTouch.UIKit.UILabel lblInfo {
        get {
            this.__mt_lblInfo = ((MonoTouch.UIKit.UILabel)(this.GetNativeField("lblInfo")));
            return this.__mt_lblInfo;
        }
        set {
            this.__mt_lblInfo = value;
            this.SetNativeField("lblInfo", value);
        }
    }

    [MonoTouch.Foundation.Connect("lblReleaseDate")]
    private MonoTouch.UIKit.UILabel lblReleaseDate {
        get {
            this.__mt_lblReleaseDate = ((MonoTouch.UIKit.UILabel)(this.GetNativeField("lblReleaseDate")));
            return this.__mt_lblReleaseDate;
        }
        set {
            this.__mt_lblReleaseDate = value;
            this.SetNativeField("lblReleaseDate", value);
        }
    }

    [MonoTouch.Foundation.Connect("lblTitle")]
    private MonoTouch.UIKit.UILabel lblTitle {
        get {
            this.__mt_lblTitle = ((MonoTouch.UIKit.UILabel)(this.GetNativeField("lblTitle")));
            return this.__mt_lblTitle;
        }
        set {
            this.__mt_lblTitle = value;
            this.SetNativeField("lblTitle", value);
        }
    }

BasicTableVIiewSource.cs

        public override UITableViewCell GetCell(UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
    {
        UITableViewCell cell = tableView.DequeueReusableCell(this._cellIdentifier);

        myTableViewCell mycell = null;
        //if (cell == null)
        //{
            mycell = new myTableViewCell();
            //NSBundle.MainBundle.LoadNib("RootViewController", _controller, null);
            //_controller.myTableCell = new myTableViewCell();
            //mycell = _controller.myTableCell;
            //cell = new UITableViewCell(UITableViewCellStyle.Subtitle, this._cellIdentifier);
        //}
        //else
        //{
        //  mycell = (myTableViewCell)cell;
        //}


                TrailerInfo item = this._tableItems[indexPath.Section].items[indexPath.Row];

                mycell.Title = item.Title;
                mycell.Info = "Genre: " + item.genre ;  
                mycell.ReleaseDate = Convert.ToDateTime(item.Releasedate).ToLongDateString();
                mycell.Accessory = UITableViewCellAccessory.DisclosureIndicator;
                if(!string.IsNullOrEmpty(item.ImageURL))
                {
                    mycell.myImage = item.image;

                }

    return mycell;

}

RootViewController.xib.designer.cs

// Base type probably should be MonoTouch.UIKit.UIViewController or subclass
//[MonoTouch.Foundation.Register("RootViewController")]
public partial class RootViewController {

    private MonoTouch.UIKit.UITableView __mt_view;

    #pragma warning disable 0169
    [MonoTouch.Foundation.Connect("view")]
    private MonoTouch.UIKit.UITableView view {
        get {
            this.__mt_view = ((MonoTouch.UIKit.UITableView)(this.GetNativeField("view")));
            return this.__mt_view;
        }
        set {
            this.__mt_view = value;
            this.SetNativeField("view", value);
        }
    }
}

RootViewController.xib

        public override void ViewDidAppear(bool some)
    {
        this.TableView.Source = new BasicTableViewSource(items, this);
    }

Как видите, со временем я менял код.Я не уверен, что именно проблема.В последнее время он продолжает говорить мне, что свойства (title, info, releaseate) являются нулевыми.Поэтому я предполагаю, что mytableviewcell не инициируется (или на него не ссылаются).Такое ощущение, что два частичных класса RootViewControlller не работают вместе.Опять же, это всего лишь догадка, я просто не понимаю, что происходит не так.Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

Это похоже на копию Кнопка в ContentView вызывает сбой во время выполнения MonoTouch. Ошибка в Monotouch 4.0?

и также отслеживается на багзилле Хамарина @ http://bugzilla.xamarin.com/show_bug.cgi?id=134

Основная проблема заключается в том, что ничто не ссылается на управляемый 'mycell', возвращаемый GetCell , поэтому GC (сборщик мусора) может (и делает) собирать / освобождать его. Все, что связано только с ячейкой, также может быть собрано, и это может произойти сбой позже, когда вы нажмете на обработчик событий.

Чтобы обойти это, сохраните ссылку (например, список <>) на созданные вами ячейки. Это гарантирует, что GC не сможет их собрать, и все, что находится внутри него, будет живым, когда это необходимо (например, обработчик событий).

0 голосов
/ 07 сентября 2011

решено!Я думаю, что это была какая-то опечатка.Я старательно прошел каждую строку кода, повторяя все шаги из книги Wrox, и теперь это работает!Поэтому я думаю, что я написал неправильное имя где-то в IB.

В конце концов, это не был агрессивный сбор мусора.но спасибо за предложение!

...