UITableViewController остается пустым после получения предупреждения памяти - PullRequest
2 голосов
/ 28 марта 2012

Я рисую табличное представление в MonoTouch, используя подклассы UITableViewController и UITableViewSource (не UITableViewDataSource !!!).В конструкторе моего контроллера представления я установил источник табличного представления следующим образом:

TableView.Source = new CustomTableViewSource();

И в моем CustomTableViewSource я создаю ячейку табличного представления.Это прекрасно работает, за исключением случаев, когда я симулирую предупреждение памяти в симуляторе iPhone.Если представление скрыто (например, выбран другой контроллер представления в панели вкладок), когда я вернусь, представление таблицы будет просто пустым (белый фон, представление таблицы больше не будет).

Однако я ничего не делаю в обратном вызове DidReceiveMemoryWarning.Я также попытался снова установить TableViewSource в viewWillAppear (если получено предупреждение памяти), но больше нет успеха ...

Это проблема сборщика мусора?Я знаю, что GC.Collect вызывается при получении предупреждения памяти.Может быть, сборщик мусора просто отбрасывает мой взгляд, и мне нужно полностью отобразить его?

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

Вы должны инициализировать источник таблицы в методе ViewDidLoad, а не в конструкторе.Этот метод вызывается, когда контроллер представления загружается, а затем каждый раз, когда представление контроллера необходимо заново создавать после предупреждения о памяти.

Я провел несколько тестов и получаю аналогичные результаты после предупреждения о памяти.Тем не менее, я получаю только пустое представление таблицы.Когда я снова устанавливаю источник таблицы в ViewWillAppear, таблица обычно заполняется данными.

Тот факт, что ваша реализация в ViewWillAppear не работает, заставляет меня думать, что метод даже не вызывается.Если это так, я предполагаю, что ваше табличное представление не создается заново, когда это необходимо.

Это может произойти при определенных обстоятельствах, когда вы используете контроллеры, представления которых не созданы из файла XIB.В этом случае вы должны создать представление в методе LoadView (без вызова base.LoadView ()):

public override void LoadView()
{
    this.View = new UITableView(UIScreen.MainScreen.ApplicationFrame); //or something similar
}

У меня были похожие проблемы (представления таблиц, где они не создавались заново) со сложной иерархиейконтроллеры вкладок, которые содержали контроллеры навигации, которые содержали контроллеры представления и т. д. Проблемы были решены, когда я предоставил метод LoadView.

Я не догадываюсь;)

1 голос
/ 29 марта 2012

Подводя итог, мое решение, которое работает:

public class LoginViewController : UITableViewController
{
  LoginDataSource m_loginDataSource;

  public LoginViewController(UITableViewStyle withStyle) : base(withStyle)
  {
   m_loginDataSource = new LoginDataSource(this);
  }

  public override void LoadView()
  {
    this.View = new UITableView(UIScreen.MainScreen.ApplicationFrame,  UITableViewStyle.Grouped);
  }

  public override void ViewDidLoad ()
  {
    base.ViewDidLoad ();
    TableView.Source = m_loginDataSource;
  }
}
1 голос
/ 28 марта 2012

Вы правы, что GC.Collect() будет вызываться при получении предупреждения памяти.Это серьезное предупреждение от операционной системы, и MonoTouch попытается освободить собственную память (если это возможно).Вы можете расширить это, переопределив DidReceiveMemoryWarning, так что ваше приложение может также освободить любую память, которая ему абсолютно не требуется.

Этот вызов GC (как и любой другой) означает, что каждый объект, на который нет ссылкиможно собрать и освободить.Теперь ваш экземпляр CustomTableViewSource не должен собираться (если только ваш TableView не установлен).Если вы сомневаетесь, вы можете проверить это, добавив финализатор для типа, например,

~CustomTableViewSource ()
{
    Console.WriteLine ("~CustomTableViewSource");
}

Однако объекты, которые являются частью вашего CustomTableViewSource , могут быть собраны (если на них нет ссылок) какдругие части (UI) вашего стола могут быть.Невозможно сказать, не увидев исходный код.

Я предлагаю вам попытаться выяснить, что освобождается, и оттуда вы должны увидеть, что нужно, чтобы сохранить ссылку (чтобы избежать их сбора) или что нужновоссоздать (если некоторые экземпляры были освобождены преднамеренно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...