2011-04-06 6 views
1

UIViewController을 모달로 표시하며 해당보기에 다양한 UITextFields이 포함되어 있습니다. 나는 모달보기 InputAccessoryView을 오버라이드하여 단순한보기를 보여주고 하나의 버튼은 에서 UITextField으로 바뀌어 키보드를 닫습니다.InputAccessoryView가 재정의 된 경우 Modal View 소멸자가 호출되지 않음

최근에 저는 메모리 관련 문제를 정리하여 모든 컨트롤러에 이제 소멸자가 있습니다. Modal View가 해제 될 때마다 키보드가 오버라이드 된 InputAccessoryView으로 표시 될 때마다 소멸자가 호출되지 않는다는 것을 알았습니다. 이것이 UIViewController이 파괴되지 않는다는 것을 의미합니까? InputAccessoryView를 잘못 표시하고 있습니까? 다음과 같이

InputAccessoryView 코드는 다음과 같습니다

bool accessoryViewInit = false; 
UIView accessoryView = new UIView(new RectangleF(0,0,320,30)); 

public override UIView InputAccessoryView 
{ 
    get 
    { 
     if (!accessoryViewInit) 
     { 
      accessoryView.BackgroundColor = UIColor.FromRGBA(0.0f, 0.0f, 0.f, 0.5f); 
      UIButton dismiss = new UIButton(new RectangleF(50,1, 200, 28)); 
      dismiss.BackgroundColor = UIColor.Blue; 
      dismiss.SetTitle("Close Keyboard", UIControlState.Normal); 
      dismiss.TouchUpInside += delegate(object sender, EventArgs e) { 
       field1.ResignFirstResponder(); 
       field2.ResignFirstResponder(); 
       field3.ResignFirstResponder(); 
      }; 
      accessoryView.AddSubview(dismiss); 
     }  
     return accessoryView; 
    } 
} 

I가 내가이에 대한 참조를 유지하고, 버튼의 TouchUpInside 이벤트에 대리자를 지정하고 있습니다 때문입니다 느낌, 전체 컨트롤러가 파괴되는 것을 막는가?

내가 문제를 다시 만들려면 https://github.com/lukewhitt/InputAccessoryView-test

에서 찾을 수있는 샘플 프로젝트를 만들었습니다 실행 앱 큰 빨간 버튼을 터치하여 현재 모달보기를. 이제 키보드를 표시하지 않고 뷰를 닫으면 소멸자가 호출됩니다. UITextField의 첫 번째 응답자 (키보드 및 InputAccessoryView 표시)를 누른 다음 모달 컨트롤러를 닫으면 소멸자가 호출되지 않습니다.

편집

그것은이 업 오는 릴리스에서 수정 될 예정입니다 Monotouch에서 버그가 나타납니다. 이 문제를 해결하기 위해 이벤트에 할당 할 때 익명의 대리자를 사용할 수없는 것 같습니다. 그래서 dismiss.TouchUpInside이 될 것입니다 : 소멸자가 발생

if (dismiss != null) 
{ 
    dismiss.TouchUpInside -= HandleDismissTouch; 
    dismiss.Dispose(); 
    dismiss = null; 
} 

호출 할 :

public override UIView InputAccessoryView { 
// code before 
    dismiss.TouchUpInside += HandleDismissTouch; 
// rest of code 
} 

private void HandleDismissTouch (object sender, EventArgs e) 
{ 
    field1.ResignFirstResponder(); 
    field2.ResignFirstResponder(); 
    field3.ResignFirstResponder(); 
} 

을 다음 모달 컨트롤러를 일축 코드에서, 나는 다음과 같은 추가했습니다! 난 당신이 MT 4에서 수정 될 예정입니다 MT에서이 문제에 직면하고 있다고 생각

답변

1

이 방출 컨트롤러 방지 할 수있는 이벤트 핸들러처럼 보이는 :

UIView events and garbage collection

불행하게도

을, 제프는 추적 조사에 응답하지 않았습니다 이 포스터에 어떤 의미가 있는지 질문하고 이벤트에 익명의 대리인을 사용하는 것이 MT4 이전 문제입니다.

유효한 해결책은 지금 수동으로 Dispose()라고 생각합니다.

+0

올바른 방향으로 나를 가리켜 주셔서 감사합니다! – Luke

+0

비슷한 문제가 있는지 코드를 확인하겠습니다. a) MT4가 출시 될 때와 b) 오래된 MT 릴리스에서 문제를 방지하는 것이 가장 좋은 방법인지 알아 보는 것은 흥미로울 것입니다. – Krumelur

관련 문제