【问题标题】:Xamarin Forms - iOS Custom Renderer - Disposing of observersXamarin Forms - iOS 自定义渲染器 - 处理观察者
【发布时间】:2021-02-05 01:40:11
【问题描述】:

当包含正在自定义的ListView 的页面消失时,以下崩溃。错误表明我的观察者没有被处理掉。

public class ChatListViewRenderer : ListViewRenderer
{
    private IDisposable _onContentSizeChangedObserver;
    private IDisposable _onFrameChangedObserver;

    protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
    {
        base.OnElementChanged(e);
        if (Control == null) return;

         _onContentSizeChangedObserver = Control.AddObserver(new NSString("contentSize"), NSKeyValueObservingOptions.OldNew, OnContentSizeChanged);
        _onFrameChangedObserver = Control.AddObserver(new NSString("frame"), NSKeyValueObservingOptions.OldNew, OnFrameChanged);
    }


    protected override void Dispose(bool disposing)
    {
        _onContentSizeChangedObserver.Dispose();
        _onFrameChangedObserver.Dispose();
        base.Dispose(disposing);
    }
}

更新

我在包含ListView 的页面的PageRenderer 中尝试了ViewWillDisapear,但问题仍然存在。

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

        var listRenderer = Platform.CreateRenderer(((MessagesPage)Element).MessagesList) as ChatListViewRenderer;
        listRenderer._onContentSizeChangedObserver.Dispose();
        listRenderer._onFrameChangedObserver.Dispose();
    }

【问题讨论】:

    标签: xamarin.ios xamarin.forms


    【解决方案1】:

    OnElementChanged 被调用两次 - 在创建控件时调用,然后在释放时调用。

    if(e.NewElement != null)
          addobserver and do other stuff
    if(e.oldElement!=null)
           remove observer and destroy everything you allocated
    

    【讨论】:

      【解决方案2】:

      一个更“直观”的例子:

      private IDisposable _onAppOrientationChangedObserver;
      
      protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
      {
         base.OnElementChanged (e);
      
         if (e.OldElement != null)
         {
            _onAppOrientationChangedObserver?.Dispose();
         }
      
         if (e.NewElement != null) 
         {
            if (Control!=null)
            {
                  _onAppOrientationChangedObserver = NSNotificationCenter.DefaultCenter.AddObserver(UIDevice.OrientationDidChangeNotification, (obj) =>
                  {
                    _uiOrientation = UIApplication.SharedApplication.StatusBarOrientation;
                    _deviceOrientation = UIDevice.CurrentDevice.Orientation;
                  });
            }
         }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-29
        • 2018-08-19
        • 2016-09-03
        • 2018-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多