C# UIAlertController中UIExtField的UIDatePicker的ValueChanged导致应用程序崩溃

C# UIAlertController中UIExtField的UIDatePicker的ValueChanged导致应用程序崩溃,c#,xamarin.ios,uitextfield,uidatepicker,uialertcontroller,C#,Xamarin.ios,Uitextfield,Uidatepicker,Uialertcontroller,我实例化一个UIAlertController,并将UIDatePicker分配给它的一个UITextField作为输入视图。我还为选择器分配了一个ValueChanged事件处理程序。UIDatePicker正确显示所提到的UITextField何时获得焦点,但当我更改应用程序崩溃日期的值时 请考虑下面的代码。 var d = UIAlertController.Create( "Confirm", "Fill below with the required info.", UIAlertCo

我实例化一个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);
同样,拾荒者表现得很好。即使使用空处理程序
picker.ValueChanged+=(对象发送方,EventArgs e)=>{},应用程序也会在ValueChanged事件上崩溃

如果不添加事件处理程序,则不会发生崩溃

此代码位于事件处理程序内部的按钮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);
}

对不起,我把帖子搞砸了:在原来的帖子里,触碰是绝对不需要的。所需的事件处理程序是标题ValueChanged中指定的事件处理程序。我更新了它。不过,现在我将尝试按照您的建议保留一个类范围引用。这绝对是正确的!收藏太早了。全局引用成功了!再次感谢!