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()/