[iphone] “wait_fences : 응답을받지 못했습니다 : 10004003”?
다음 코드 줄로 인해 내 뷰가 처음로드 될 때 (그리고 처음에만)이 비밀 오류가 발생합니다.
- (void)viewWillAppear:(BOOL)animated
{
[textField becomeFirstResponder];
}
이로 인해 내 앱이 응답하지 않는 것처럼 느껴지는 눈에 띄는 (시뮬레이터에서도 ~ 3-4 초) 지연이 있습니다. 누구든지 이것을 고치는 방법을 알고 있습니까? Apple 사이트 또는 여기 또는 Google에서 솔루션에 대한 문서를 찾을 수 없습니다.
이상하게도 -viewDidAppear:
대신 줄을 넣으면 반대 상황이 발생합니다 -viewWillAppear:
. 즉, 키보드가 처음 표시 될 때만 오류를 인쇄하고 다시는 표시하지 않는 대신 오류가 처음 에는 인쇄 되지 않고 이후마다 인쇄됩니다. 이것은 저에게 큰 골칫거리입니다.
답변
재정의 -viewDidAppear:
하지 말고을 -viewWillAppear
호출하십시오 [super viewDidAppear:]
. 화면에 있지 않을 때 애니메이션을 수행해서는 안됩니다 ( “표시됨”). 그리고 -viewDidAppear:
문서 super
는 각자 할 일이 있기 때문에 전화해야한다고 설명합니다 .
답변
빨리 비슷한 오류가 발생했습니다.
- 모달보기 닫기
- 기본보기 업데이트
- 새로운 모달보기 제시
나는 장치가 아닌 시뮬레이터에서만 그것을 얻는다는 것을 알았습니다. 또한 무한 루프에 빠졌습니다.
내 해결책은 새로운 모달 뷰의 제시를 지연시키는 것이 었습니다. 뷰 계층 구조를 빠르게 업데이트하면 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:
will
DismissWithButtonIndex:
-alertView:
did
DismissWithButtonIndex:
becomeFirstResponder
뷰 컨트롤러가 화면에 표시되기 전에 키보드 ( ) 를 표시하지 마십시오 .
나쁜 일이 일어날 수 있습니다.
유용하기를 바랍니다 😉
답변
이것은 애니메이션이나 지연없이 키보드가 즉시 표시되도록하는 데 효과적이었습니다.
(의 하위 클래스 ) textField
의 인스턴스 변수가 되자 .MyViewController
UIViewController
전화 [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];