应用程序在UIAlertController中UIDatePicker for UITextField的ValueCha

本文关键字:UITextField ValueCha for UIDatePicker UIAlertController 应用程序 | 更新日期: 2023-09-27 18:35:07

我实例化一个UIAlertController,并将UIDatePicker分配给它的UITextField之一作为输入视图。我还为选取器分配了一个 ValueChanged 事件处理程序。UIDatePicker 正确显示上述 UITextField 何时获得焦点,但当我更改应用程序崩溃日期的值时。

请考虑下面的代码。

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 事件上崩溃,即使使用空处理程序picker.ValueChanged += (object sender, EventArgs e) => {};

不添加事件处理程序不会崩溃!

此代码位于按钮 TouchUpInside 事件处理程序中。

我哪里做错了?

应用程序在UIAlertController中UIDatePicker for UITextField的ValueCha

我认为您在代码示例中混淆了事件方法。 TouchUpInside不会为选取器触发。如果要在选择新的日期值时更新文本视图的内容,则需要使用:

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);
}