对popmodal和自定义iOS渲染器的无效参考

时间:2018-05-12 10:47:21

标签: xamarin xamarin.forms xamarin.ios

我有一个模态视图,其中我有多个Map map = { [:].withDefault { owner.call() } }.call() list.each { map[it.category][it.subcategory][it.group][it.name] = it.value } 字段,我通过iOS自定义程序自定义,以便在Entry时更改BorderColor

当我按下按钮时弹出我的模态视图时:

Focused

我在我的iOS customrenderer中得到一个null引用,因为我猜该元素突然变为null,而且我不知道它已经没有告诉它,视图已经消失了。

await Navigation.PopModalAsync(true);

我注意到,当我从public class BorderColorChange : EntryRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) { base.OnElementChanged(e); if (Control != null) { Control.Layer.BorderWidth = 1; Control.Layer.CornerRadius = 4; e.NewElement.Focused += (sender, evt) => { Control.Layer.BorderColor = UIColor.FromRGB(3, 169, 244).CGColor; }; e.NewElement.Unfocused += (sender, evt) => { Control.Layer.BorderColor = UIColor.LightGray.CGColor; }; }; } } 中删除await关键字时,它不会产生错误。

有关如何解决此错误的任何帮助?

1 个答案:

答案 0 :(得分:0)

使用e.NewElement == null调用OnElementChanged是完全正常的。这只是意味着要删除元素(就像等待PopModelAsync时那样),因此它应该处理要关联的新元素为null的更改。

使用自定义渲染器时,在将自定义渲染器与本机控件关联时发生更改时,您需要同时订阅和取消订阅事件。例如:

public class BorderColorChange : EntryRenderer
{
    private void MyFocusedEventHandler(...) ...
    private void MyUnfocusedEventHandler(...) ...

    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);
        if (Control != null)
        {
            Control.Layer.BorderWidth = 1;
            Control.Layer.CornerRadius = 4;

            if (e.OldElement != null)  // unsubscribe from events on old element
            {
                e.OldElement.Focused -= MyFocusedEventHandler;
                e.OldElement.Unfocused -= MyUnfocusedEventHandler;
            }
            if (e.NewElement != null)  // subscribe to events on new element
            {
                e.NewElement.Focused += MyFocusedEventHandler;
                e.NewElement.Unfocused += MyUnfocusedEventHandler;
            }
        }
    }
}

当条目获得/失去焦点时该做什么的逻辑进入MyFocusedEventHandler / MyUnfocusedEventHandler而不是内联以允许订阅和取消订阅。