У меня есть этот код, который прикрепляет: OnTabbarControllerItemSelected;
к tabbarController.ViewControllerSelected
. Насколько я понимаю, такие прикрепленные события также должны быть отделены позже.
Может кто-нибудь посоветует, где мне делать отсоединение. Также я должен переопределить метод Dispose для этого кода, и если да, то как мне это сделать?
Код:
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
_page = (MainPage)e.NewElement;
}
else
{
_page = (MainPage)e.OldElement;
}
if (e.OldElement != null)
{
Xamarin.Forms.Application.Current.PropertyChanged -= Current_PropertyChanged;
return;
}
try
{
var tabbarController = (UITabBarController)this.ViewController;
if (null != tabbarController)
{
Xamarin.Forms.Application.Current.PropertyChanged += Current_PropertyChanged; //subscribe to the App class' built in property changed event
tabbarController.ViewControllerSelected += OnTabbarControllerItemSelected;
UpdateTheme();
}
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}
Был бы признателен за совет о том, как я могу отсоединить этот метод аналогично тому, как отсоединяется метод Current_PropertyChanged
.
Вы пробовали tabbarController.ViewControllerSelected -= OnTabbarControllerItemSelected;
?
Где бы это было размещено. Не могли бы вы дать полный пример кода в своем ответе. Спасибо
Я думаю, что место, где будет размещено, зависит от того, где вы его отсоединяете. Это просто способ отсоединить этот метод.
Насколько я понимаю, обработчик событий - это просто делегат, обычный объект ссылочного типа под управлением GC. Его не нужно отсоединять вручную, если он остается действительным до тех пор, пока сборщик мусора не соберет событие. Это должно быть верно в большинстве случаев (например, обработчик внутри того же окна).
Возможно, вам потребуется отсоединить вручную. Это происходит, когда дочерний объект прослушивает событие родительского объекта. Если дочерний объект может быть удален до родительского, обработчик становится недопустимым (поскольку он может относиться к удаленному дочернему объекту). В этом случае вы всегда должны знать, когда он становится недействительным (в приведенном выше случае, Dispose дочернего объекта), и когда и где вы должны его отсоединить.
РЕДАКТИРОВАТЬ
Из предоставленного вами кода это непросто сказать, но, скорее всего, вам не нужно отсоединять OnTabbarControllerItemSelected
. Но с Xamarin.Forms.Application.Current.PropertyChanged
, наверное, нужно быть осторожнее.
Также см. этот вопрос.
У вас есть несколько
UITabBarController
? Вам нужно подписываться на событиеViewControllerSelected
event каждый раз, когда происходит событиеElementChanged
?