"wait_fences : 응답을받지 못했습니다 : 10004003"?


94

다음 코드 줄로 인해 내 뷰가 처음로드 될 때 (그리고 처음에만)이 비밀 오류가 발생합니다.

- (void)viewWillAppear:(BOOL)animated
{
    [textField becomeFirstResponder];
}

이로 인해 내 앱이 응답하지 않는 것처럼 느껴지는 눈에 띄는 (시뮬레이터에서도 ~ 3-4 초) 지연이 있습니다. 누구든지 이것을 고치는 방법을 알고 있습니까? Apple 사이트 또는 여기 또는 Google에서 솔루션에 대한 문서를 찾을 수 없습니다.

이상하게도 -viewDidAppear:대신 줄을 넣으면 반대 상황이 발생합니다 -viewWillAppear:. 즉, 키보드가 처음 표시 될 때만 오류를 인쇄하고 다시는 표시하지 않는 대신 오류가 처음 에는 인쇄 되지 않고 이후마다 인쇄됩니다. 이것은 저에게 큰 골칫거리입니다.

답변:


103

재정의 -viewDidAppear:하지 말고을 -viewWillAppear호출하십시오 [super viewDidAppear:]. 화면에 있지 않을 때 애니메이션을 수행해서는 안됩니다 ( "표시됨"). 그리고 -viewDidAppear:문서 super는 각자 할 일이 있기 때문에 전화해야한다고 설명합니다 .


이것은 내가 원하는만큼 반응하지 않지만 (매번 키보드를 표시하는 데 여전히 약간의 지연이 있음) 트릭을 수행하는 것 같습니다.
Michael

1
나는 당신이 말하는 지연을 알고 있습니다. 많은 앱에서 본 적이 있습니다. 아직 호출하지 않은 경우-[super viewDidAppear :]를 호출하기 전에 (후가 아니라) -becomeFirstResponder를 호출 할 수 있습니다. 이는 영향을 미치지 않을 수 있지만 다음 이벤트가 아닌 동일한 이벤트 루프에서 애니메이션이 시작될 수 있습니다. 나는 아직 확인하기 위해 이것을 실험하지 않았습니다.
Rob Napier

14
이것은 문제를 해결하지 않습니다. viewDidAppear에서 UIAlertSheet를 던지면 [super viewDidAppear : animated]를 호출 한 후 매번 동일한 메시지가 표시됩니다. 그러나 나중에 ibaction에 대한 응답으로 그것을 던지면 문제가 없습니다. 따라서 performWithSelector는 아마도 수정하는 방법 일 것입니다. 또는 메시지를 무시할 수 있습니다. 어느 쪽이든 이것은 코드 문제가 아니라 SDK 버그 인 것처럼 보입니다.
Billy Gray

9
@Billy, 애니메이션이 완료되기 전에 UIAlertSheet를 던지면 동일한 문제가 발생할 수 있습니다. 어쨌든 viewDidAppear 안에 시트를 넣는 것은 아마도 너무 이르고 아마도 performSelector : afterDelay :를 사용하여 UIAlertSheet를 다음 루프로 푸시해야합니다. 여기에 세부 사항이 제대로 문서화되어 있지 않지만 SDK의 버그는 아닙니다. -viewWillAppear에서 애니메이션을 수행하는 것은 원래 코드의 버그였습니다. 두 경우 모두 메시지를 무시해서는 안됩니다. 이상한 시각적 아티팩트 (애니메이션의 이상한 측면 슬라이딩)가 발생할 수 있습니다.
Rob Napier


22

빨리 비슷한 오류가 발생했습니다.

  1. 모달보기 닫기
  2. 기본보기 업데이트
  3. 새로운 모달보기 제시

나는 장치가 아닌 시뮬레이터에서만 그것을 얻는다는 것을 알았습니다. 또한 무한 루프에 빠졌습니다.

내 해결책은 새로운 모달 뷰의 제시를 지연시키는 것이 었습니다. 뷰 계층 구조를 빠르게 업데이트하면 Apple 코드에서 경합 상태가 발생한 것 같습니다.

이를 염두에두고 다음을 시도하십시오.

     - (void)viewDidAppear:(BOOL)animated{

            [super viewDidAppear:animated];
            [textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1];
  }

아직 화면에없는 UITextField에 대한 키보드를 표시하는 데 문제가있을 수 있습니다. 이것은 나와 비슷한 문제를 일으킬 수 있습니다.

또한 경우에 대비하여 키보드를 표시하기 전에 계층 구조를 업데이트 할 시간을 제공하는 것을 일시 중지합니다.

도움이 되었기를 바랍니다.


3
모달 관련 문제에 대해 새 모달을 제시하기 전에 모달이 종료 될 때까지 기다리셨습니까? 임의의 시간을 기다렸다가 완료되기를 바라는 대신 modalViewController에서 -viewDidDisappear를 재정 의하여 알 수 있습니다. 모달의 -parentViewController를 다시 호출하거나 알림을 게시 할 수 있습니다. 열쇠는 무시할 것을 요청하는 것이 아직 사라진 것을 의미하지 않으며 일반적으로 서로 위에 애니메이션을 적용해서는 안된다는 것을 이해하는 것입니다. -viewWill / DidDisappear는 일반적으로 상황이 언제 발생하는지 확인하는 가장 좋은 방법입니다.
Rob Napier

첫 번째 모달 뷰는 사진 선택기 였고 저는 사진 선택기 콜백 메서드 내에서 모든 것을 처리합니다. 귀하의 권리, viewDdiAppear 내에서 다음 모달보기를 시작하는 코드를 배치해야합니다. 더 나은 솔루션이며 플랫폼에 관계없이 문제를 해결할 가능성이 높습니다.
Corey Floyd

12

메인 스레드의 UI 와만 상호 작용하고 있는지 확인하십시오. 내가 가지고 wait_fences: failed to receive reply: 10004003내가 관련 코드가 백그라운드 스레드에서 실행 되었기 때문에 UIAlertView가 약 5 초 동안 보여 기다리고 거기에 앉아있는 동안. 코드를 블록에 넣고 메인 스레드로 보내서 확인할 수 있습니다.

dispatch_async(dispatch_get_main_queue(), ^{
    if (!success) {
        // Inform user that import failed
        UIAlertView * importFailedAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"ErrorTitle5", @"Import failed") 
                                                                     message:NSLocalizedString(@"Error5", @"Something went wrong") 
                                                                    delegate:nil 
                                                           cancelButtonTitle:NSLocalizedString(@"OK", nil) 
                                                           otherButtonTitles:nil];
        [importFailedAlert show];
    }
});

9

Google에서 찾을 수있는 모든 것을 시도했지만 작동하지 않는 것이 문제를 해결했습니다. 핵심은 willDismissWithButtonIndex 대리자 메서드에서이 작업을 수행하고 있다는 것입니다. 내가 다른 곳에서하기 전에.

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
{
    [myTextField resignFirstResponder];
    [myTextField removeFromSuperview];  
    [myTextField release];  
}

8

viewDidLoad에 다음 줄이있는 경우이 메시지가 발생할 수 있습니다. 다음 줄을 주석 처리하십시오.

[[UIApplication sharedApplication] setStatusBarHidden:YES]; //This line should be commented

(대신 애플리케이션 plist 파일에서 상태 표시 줄을 비활성화 할 수 있습니다).


7

몇 번의 테스트 후 큰 규칙은 "애니메이션 해고 또는 애니메이션 쇼 전에 애니메이션을 수행하지 마십시오."입니다.

예를 들면 :

  • -dismissModalViewControllerAnimated:YES의 위임 콜백 후에 호출하지 마십시오 ( 콜백을 사용하여이를 수행하기 전에 경고보기에서 페이드 아웃 대기 ).UIAlertView -alertView:willDismissWithButtonIndex:-alertView:didDismissWithButtonIndex:
  • becomeFirstResponder뷰 컨트롤러가 화면에 표시되기 전에 키보드 ( ) 를 표시하지 마십시오 .

나쁜 일이 일어날 수 있습니다.

유용하기를 바랍니다 ;-)


clickedButtonAtIndex를 사용하고 있었고 alertview가 닫히기 전에 많은 텍스트 필드를 채웠습니다. didDismissWithButtonIndex로 전환하면 이러한 경고를 제거하는 데 확실히 도움이되었습니다! 감사!
Nitin Alabur 2012

5

이것은 애니메이션이나 지연없이 키보드가 즉시 표시되도록하는 데 효과적이었습니다.

(의 하위 클래스 ) textField의 인스턴스 변수가 되자 .MyViewControllerUIViewController

전화 [textField becomeFirstResponder]에서 initWithNibName:bundle:(의 서브 클래스 UIViewController) 또는 initWithStyle:(의 서브 클래스에 대한 UITableViewController,하지에) viewDidLoad. 예 :

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [textField becomeFirstResponder];
    }
    return self;
}

또는 초기화 직후에 UIViewController. 예 :

MyViewController *viewController = [[MyViewController alloc] init];
[viewController.textField becomeFirstResponder];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];

흥미 롭군. 이것이 항상 작동한다고 확신합니까? 내 우려는을 참조하지 않아서 viewnib 파일이로드되었는지 확실하지 않다는 것입니다. 경우 textField함께 IBOutlet입니다, 나는 그것이이 시점에서 전무하다고 생각합니다.
Rob Napier

5

당신은 했어요 [textfield becomeFirstResponder];

그리고 코드의 텍스트 필드에서 값을 얻은 후 [textfield resignFirstResponder];. 그것은 당신을 도울 것입니다.


4

현재 iPhone Simulator 4.0을 실행중인 경우 애니메이션에서 1-2 초 지연과 함께 화면을 회전 할 때 (또는 화면을 회전 한 후 애니메이션 할 때)이 오류 메시지가 자주 나타납니다.

이 시뮬레이터 버전의 버그이며 곧 수정 될 예정입니다.


iOS4 시뮬레이터 버그에 대한 정보에 감사드립니다. 같은 프로젝트의 wait_fences경우 3.1 시뮬레이터에 메시지가 표시되지 않았습니다
ohho

3

자세한 내용은 여기를 참조하십시오. http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/17373-wait_fences-failed-receive-reply-10004003-a.html

귀하의 문제는 관련이 있습니다.


도움을 주셔서 감사합니다.하지만 안타깝게도 해당 페이지에서 내 문제에 대한 해결책을 찾을 수 없습니다. "하위보기 (예 : UIAlertView)가 상위 / 수퍼보기 이전에 생성 될 때 발생하는 것 같습니다." 위의 코드에서는 이런 일이 일어나지 않아야합니다. 그렇죠?
Michael

3

재정의 viewDidappear가 아니라 viewWillAppear:

-(void) viewDidAppear:(BOOL) animated
{
 [super viewDidAppear:animated];
 [myTextField becomeFirstResponder];
}

3

이 UIAlertView 코드를 사용하여 일대일로 시뮬레이션 할 수 있습니다.

   UIAlertView *alert = [[UIAlertView alloc]
                   initWithTitle:NSLocalizedString(@"defineTitle",@"defineTitle")
                         message:NSLocalizedString(@"defineBody", @"defineBody")
                        delegate:self
               cancelButtonTitle:NSLocalizedString(@"Ok", @"Ok")
               otherButtonTitles:nil];
   [alert show];

NSLocalizedString이 Localizable.strings 파일에 정의되어 있지 않으면 텍스트를 검색하는 데 시간이 오래 걸리므로 경고가 표시되고 "wait_fences : 응답 수신 실패 : 10004003"이 표시됩니다.

저에게는 Localizable.strings 파일에 텍스트를 추가하기 만하면 문제가 해결되었습니다. 아마도 이것은 다른 사건의 경우일까요?


1

또한 UIAlertView와 함께. 나를 위해 그것을 해결 한 것은 앞에서 언급 한 Warehouselabs처럼 아래와 같이 사임하는 것이 었습니다.

- (void)didPresentAlertView:(UIAlertView *)alertView
{
    [txtListingPassword becomeFirstResponder];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    [txtListingPassword resignFirstResponder];
}

UIAlertViewDelegate의 다른 대리자는 문제를 해결하지 못했습니다.


1

문제는 Apple의 코드에 경쟁 조건이 있다는 것입니다. 일반적으로 이것은 잘못된 UI 업데이트와 관련이 있습니다.

내 경험상 viewDidAppear, viewWillAppear 등에서 super를 호출하지 않았거나 viewDidLoad 또는 viewWillAppear에서 UIAlertView를 표시하려고합니다.

UIAlertView를 추가 할 때 프레임 워크에는 상위 뷰에 대한 참조가 필요합니다. 그러나 viewWillAppear 또는 viewDidLoad에있는 경우보기가 실제로 표시되지 않습니다 ... UIAlertView에서보기를 사용할 준비가 된 viewDidAppear로 코드를 이동하는 것을 고려해야합니다.


0

텍스트 필드가 해당보기 내에 포함되어 있습니까? 아니면 다른 항목에 포함되어 있습니까? 해당 뷰에 직접 포함 된 항목에만 'becomeFirstRepsonder'를 보낼 수 있습니다. 다른 위젯 구성 요소에 저장되어있는 경우이 위젯에서 첫 번째 응답자 상태를 설정하는 것이 아니라 생성중인 위젯에서 설정해야합니다. 예를 들어 경고보기에 텍스트 필드를 추가하는 경우 쇼가 비동기 적으로 발생하기 때문에 becomeFirstResponder를 호출 할 때까지 작동하지 않을 수 있습니다. (이상적으로는 자체 경고 뷰 클래스가 있고 그 안에 텍스트 필드를 정의하고 해당 뷰가 viewDidAppear를 수신하면 해당 시점에서 텍스트 필드를 첫 번째 응답자로 설정합니다.)


0

나는 또한 메시지를 wait_fences: failed to receive reply: 10004003받고 내 viewWill...viewDid...메소드는 메시지를 super. 내 경우에는 내가 UIAlertView표시 GameViewController하고 사용자가 대신 iPhone 둥근 장치 버튼을 누른 다음 앱으로 돌아갈 때 발생합니다. 이것은 내 손에서 보인다.


0

Alertview 또는 작업 시트는 기본 스레드에 표시되어야합니다. 따라서 동기 연결을 만들고 다른 스레드에서 해당 작업을 수행하고 해당 작업에서받은 출력을 기준으로 경고를 표시하면 다음 오류 메시지가 표시됩니다. wait_fences : failed to 응답을 받으십시오 : 10004003. 다음과 같이 할 수 있습니다 ....

[self performSelectotOnMainThread:@selector(handleOutput:) withObject:output waitUntilDone:YES/NO];

출력 응답 문자열을 매개 변수로 전달하는 handleOutput 메소드에 경고를 표시합니다.


0

해결책이 여기 있습니다!

같은 오류가 발생했습니다. 이제 해결책을 찾았습니다. 도움이 될 수 있습니다.

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
  [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1];
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.