Нулевая ссылка на popmodal и пользовательский рендерер iOS - PullRequest
0 голосов
/ 12 мая 2018

У меня есть модальное представление, в котором у меня есть несколько полей Entry, которые я через настраиваемый iOS-пользователь изменил BorderColor, когда Focused.

Когда я выскакиваю мой модальный вид при нажатии кнопки:

await Navigation.PopModalAsync(true);

Я получаю нулевую ссылку в моем iOS-обработчике, потому что я думаю, что элемент неожиданно становится нулевым, и я почему-то не сказалэто значит, что представление исчезло.

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 из Navigation.PopModalAsync(true);, оно не выдает ошибку.

Любая помощь о том, как решить эту ошибку?

1 Ответ

0 голосов
/ 13 мая 2018

Совершенно нормально, что OnElementChanged вызывается с e.NewElement == null. Это просто означает, что элемент удаляется (например, когда вы ожидаете PopModelAsync), поэтому он должен обработать изменение, с которым ассоциируется новый элемент, является нулевым.

При использовании пользовательских средств визуализации вам необходимо подписываться и отменять подписку на события, когда происходят изменения в связи с вашим пользовательским средством визуализации с собственным элементом управления. Так, например:

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, а не в строку, чтобы разрешить как подписку, так и отписку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...