0

Я создаю экземпляр UIAlertController и назначаю UIDatePicker одному из его UITextField (ов) в качестве входного представления. Я также назначил обработчик события ValueChanged сборщику. UIDatePicker правильно показывает, когда упомянутый UITextField получает фокус, но когда я изменяю значение даты, когда приложение вылетает.Ошибка приложения в ValueChanged UIDatePicker для UITextField в UIAlertController

Пожалуйста, ознакомьтесь с кодом ниже.

var d = UIAlertController.Create("Confirm", "Fill below with the required info.", UIAlertControllerStyle.Alert); 

d.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, ((UIAlertAction obj) => SubmitAction(obj, d)))); 
d.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, null)); 

d.AddTextField((delegate(UITextField obj) { 
    UIDatePicker picker = new UIDatePicker(); 
    picker.ValueChanged += (object sender, EventArgs e) => { obj.Text = picker.Date.Description; }; 
    obj.InputView = picker; 
})); 

PresentViewController(d, true, null); 

Опять же, сборщик появляется хорошо. Приложение вылетает из события ValueChanged даже с обработчиком EMPTY picker.ValueChanged += (object sender, EventArgs e) => {};.

Без сбоев без добавления обработчика событий!

Этот код является одним нажатием кнопки Обработчик события TouchUpInside.

Где я делаю неправильно?

ответ

1

Я думаю, что вы запутали методы событий в своем примере кода. TouchUpInside не будет срабатывать для сборщика. Если вы хотите обновить содержимое Text View, если выбрано новое значение даты, вам нужно будет использовать:

picker.ValueChanged += (pickerSender, pickerArgs) => 
{ 
     obj.Text = picker.Date.Description; 
}; 

Чтобы это предотвратить сбой, вам необходимо сохранить ссылку на экземпляр UIDatePicker вокруг, иначе он будет собран слишком рано. Самый простой способ для перемещения выбора даты в области видимости класса:

public override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    // Perform any additional setup after loading the view, typically from a nib. 
    this.btnTest.TouchUpInside += HandleTouchUpInside; 
} 

UIDatePicker picker; 

void HandleTouchUpInside (object sender, EventArgs e) 
{ 
    var d = UIAlertController.Create("Confirm", "Fill below with the required info.", UIAlertControllerStyle.Alert); 

    d.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, ((UIAlertAction obj) => {}))); 
    d.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, null)); 

    d.AddTextField((delegate(UITextField obj) { 
     picker = new UIDatePicker(); 
     picker.ValueChanged += (pickerSender, pickerArgs) => 
     { 
      obj.Text = picker.Date.Description; 
     }; 
     obj.InputView = picker; 
    })); 
    PresentViewController(d, true, null); 
} 
+0

К сожалению, я совершенно перепутался должность: TouchUpInside был абсолютно нежелательным в исходном сообщении. Необходимым обработчиком событий является тот, который указан в заголовке ValueChanged. Я обновил его. Однако теперь я попытаюсь сохранить ссылку на класс, как вы предложили. – Shockwaver

+0

И это было абсолютно! Слишком ранняя коллекция. Глобальная ссылка сделала трюк! Еще раз спасибо! – Shockwaver

Смежные вопросы