我有一个模态视图,其中我有多个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
关键字时,它不会产生错误。
有关如何解决此错误的任何帮助?
答案 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而不是内联以允许订阅和取消订阅。