2014-04-02 4 views
1

나는 인스턴스가이 같은 경고보기 보여줄 수있는 클래스가 있습니다단추를 누를 때 UIAlertView가 충돌합니다. 해결 방법은 무엇입니까?

- (void)showAlert 
{  
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Do you want to try again?" 
                 message:nil 
                 delegate:self 
               cancelButtonTitle:@"Yes" 
               otherButtonTitles:@"No", nil]; 

    [alertView show]; 
} 

}

내가 어떤 작업을 수행하기 위해 호출 할 수 alertView:didDismissWithButtonIndex: 필요하기 때문에 대리자로 self 필요를 때 사용자 경고보기의 단추를 두드립니다. 이것은 일반적으로 잘 작동하지만, 수시로,이 충돌 얻을 : 바로, 대리자, 어떤 이유로, 발표했기 때문에이 추측

SIGSEGV 
UIKit-[UIAlertView(Private) modalItem:shouldDismissForButtonAtIndex:] 

를? 또는 발표 된 것은 경고보기 였기 때문에이게 맞습니까? 어떻게 해결할 수 있을까요? 대리자가 있으려면 경고보기가 필요하며 여러 관련 게시물을 읽었으며 시나리오에 맞는 대답을 찾을 수 없습니다.

iOS 7.0에서 테스트 중이므로 문제와 관련이 있는지 알 수 없습니다. 그것의 위임이 해제 될 때 경고를 누르 것으로 보인다 사전

+0

메인 스레드에서 alertview를 호출하고 있는지 확인하십시오. – Rose

+0

'[NSThread isMainThread] '로 확인 할 수 있습니다. –

+0

항상보기 컨트롤러에서 경고보기를 보여주는 개체를 만듭니다. 그것은 강한 재산입니다. 메인 스레드에서 항상 호출된다고 가정 할 수 있습니까? 불행히도이 충돌을 의도적으로 일으키는 방법을 모르겠습니다. – AppsDev

답변

3

감사 :

delegate:self 

UIAlertView의 위임 속성이 할당 타입이기 때문에 발생 (약한하지!). 따라서 대리인이 공개 된 개체를 가리킬 수 있습니다.

솔루션 : 당신이 당신의 alertView 위양을 삭제해야 할당 해제의 방법에

- (void)dealloc 
{ 
    _alertView.delegate = nil; 
} 

하지만 바르 _alertView을하고 alertViews

- (void)showAlert 
{  
    _alertView = ...; 

    [_alertView show]; 
} 
0

업데이트를 위해 그것을 사용할 필요가 전에 귀하의 코드는 다음과 같습니다 :

- (void)showAlert {  
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Do you want to try again?" 
                 message:nil 
                 delegate:self 
               cancelButtonTitle:@"Yes" 
               otherButtonTitles:@"No", nil]; 

    [alertView show]; 
} 

otherButtonTitles 부분에 nil이 누락되었습니다.

nil을 추가하지 않은 경우 방법 출고 경고 메시지가 표시됩니다.

+0

고마워, 내 잘못 ... 실제로는 'nil'이 추가되었지만 여기에 붙여 넣은 코드에서 제거 된 것 같습니다. 죄송합니다. 나는 그것을 편집 할 것이다. – AppsDev

+0

아직도 충돌이 있습니까? –

+0

예, 계속 충돌하고 있습니다 ... – AppsDev

0

경고보기의 대리자 객체가 버튼을 클릭하는 동안 해제 되었기 때문입니다. 나는 그것이 SDK의 버그라고 생각 :

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate; // weak reference 

가 있어야한다 :

@property(nonatomic, weak) id /*<UIAlertViewDelegate>*/ delegate; // weak reference 

이 문제를 해결하려면 :

  1. 이 연결을 사용하여 UIAlertView에 대한 약한 대리자를 추가합니다.
  2. init, setDelegate : 대리자 메서드를 swizzle로 설정하고 alertView 대리자를 self로 설정하고 1 단계 weak delegate를 param 대리자로 설정합니다.
  3. 모든 대리자 메서드를 구현하고 약한 대리자를 사용하여 메서드를 제공합니다.