[iphone] “wait_fences : 응답을받지 못했습니다 : 10004003”?

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

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

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

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



답변

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


답변

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

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

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

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

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

     - (void)viewDidAppear:(BOOL)animated{

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

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

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

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


답변

메인 스레드의 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];
    }
});


답변

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

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


답변

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

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

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


답변

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

예를 들면 :

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

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

유용하기를 바랍니다 😉


답변

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

(의 하위 클래스 ) 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];