0

UIAlertController를 인스턴스화하고 UITatePicker를 UITextField 중 하나에 입력보기로 지정합니다. 또한 Picker에 ValueChanged 이벤트 처리기를 할당했습니다. UIDatePicker 올바르게 언급 된 UITextField 포커스를 얻을 때 보여줍니다 있지만 응용 프로그램 충돌 날짜 값을 변경할 때.UIAlertController의 UITextField에 대한 UIDatePicker의 ValueChanged에서 응용 프로그램이 충돌합니다.

아래 코드를 고려하십시오.

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

다시 피커가 잘 나타납니다. 앱이 EMPTY 처리기 picker.ValueChanged += (object sender, EventArgs e) => {}; 인 경우에도 ValueChanged 이벤트에서 충돌합니다.

이벤트 처리기를 추가하지 않으면 충돌이 없습니다!

이 코드는 TouchUpInside 이벤트 핸들러에 있습니다.

어디에서 잘못 했습니까?

답변

1

코드 샘플에서 이벤트 메서드를 혼동스럽게 생각합니다. 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); 
} 
+0

죄송합니다. 전적으로 게시물을 엉망으로 만들었습니다. TouchUpInside는 원래 POST에서 전혀 필요하지 않았습니다. 필수 이벤트 핸들러는 제목 ValueChanged에 지정된 이벤트 핸들러입니다. 나는 그것을 새롭게했다. 그러나 이제는 제안한대로 클래스 범위 참조를 유지하려고 노력할 것입니다. – Shockwaver

+0

그리고 그건 절대적으로! 너무 일찍 수집. 글로벌 레퍼런스가 트릭을 만들었습니다! 다시 한 번 감사드립니다! – Shockwaver