Monotouch/iOS: какое место лучше всего отписать делегату

Лучший способ подписаться на событие в iOS - это ViewDidLoad, но при закрытии представления ViewDidUnload() не вызывается (только при предупреждении памяти).

В каком месте лучше всего отписаться от мероприятия?

(В subviewController я подписываюсь на событие, которое ссылается на MainViewController. Когда я дважды открываю подпредставление, я получаю два триггера событий, потому что отмена подписки в viewdidunload() никогда не вызывается.)

Как насчет подписки / отписки в ViewWillAppear/ViewWillDisapper?

    public override void ViewWillAppear (bool animated)
    {
        base.ViewWillAppear (animated);

        this.mBL.OrderChanged += HandleOrderChanged;            
    }

    public override void ViewWillDisappear (bool animated)
    {
        base.VieWillDisappear (animated);
        if (this.mBL!=null)
          this.mBL.OrderChanged -= HandleOrderChanged;          
    }

2 ответа

Решение

Использование ViewDidLoad а также ViewDidUnloadэто подходящие места для подписки / отмены подписки на события в пользовательском интерфейсе.

Вот общая статья об управлении памятью в iOS, которая, я думаю, применима здесь: http://www.buildingiphoneapps.com/buildingiphoneapps/2010/6/25/memory-management-and-viewdidunload.html

Теперь, если вы не хотите запускать событие, когда ваш View не виден, сделайте что-то вроде этого в обработчике событий:

if (IsViewLoaded && View.Window != null) {
  //code here
}

Я обнаружил, что это самый простой способ узнать, отображается ли изображение на экране.

Я согласен, лучшее время для ViewWillAppear/ViewWillDisappear, а не ViewDidUnload.

ViewDidUnload называется постом iOS 6: https://developer.xamarin.com/api/member/UIKit.UIViewController.ViewDidUnload()/

Другие вопросы по тегам