"wait_fences: не удалось получить ответ: 10004003"?

Я получаю эту загадочную ошибку в первый раз (и только в первый раз) мое представление загружается из-за следующей строки кода:

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

Отмечается заметная (~ 3 - 4 секунды, даже на симуляторе) задержка, из-за которой мое приложение не реагирует. Кто-нибудь знает, как это исправить? Я не могу найти документацию на нем на сайте Apple или любые решения здесь или в Google.

Странно, происходит противоположная ситуация, если я помещаю строку в -viewDidAppear: вместо -viewWillAppear:; то есть вместо того, чтобы печатать ошибку только в первый раз, когда клавиатура отображается и никогда больше, ошибка не печатается в первый раз, но каждый раз после. Это вызывает серьезную головную боль для меня.

Ответ 1

Заменить -viewDidAppear:, а не -viewWillAppear, и обязательно вызовите [super viewDidAppear:]. Вы не должны выполнять анимацию, когда вы не находитесь на экране ( "появится" ). И -viewDidAppear: docs объясняют, что вы должны называть super, потому что у них есть свои дела.

Ответ 2

Я получаю аналогичную ошибку, когда быстро:

  • Отказ от модального представления
  • Обновление основного вида
  • Представление нового модального представления

Я заметил, что я только получил его в симуляторе, а не на устройстве. Кроме того, я попадал в бесконечный цикл.

Мое решение состояло в том, чтобы отложить представление нового модального представления. Похоже, что быстрое обновление иерархии представлений вызвало некоторое несоответствие состояния гонки в коде Apple.

С учетом этого попробуйте следующее:

     - (void)viewDidAppear:(BOOL)animated{

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

У вас могут возникнуть проблемы с клавиатурой для UITextField, которая еще не отображается на экране. Это может вызвать проблемы, похожие на мои.

Кроме того, вы делаете паузу, предоставляя время иерархии для обновления, прежде чем представлять клавиатуру на всякий случай.

Надеюсь, что это поможет.

Ответ 3

Проверьте, что вы взаимодействуете с пользовательским интерфейсом только в основном потоке. Я получил 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];
    }
});

Ответ 4

После того, как я попытался найти все, что мог найти в Google, и никто из них не работает, это то, что решило проблему для меня. Ключ в том, что я делаю это в методе делегата willDismissWithButtonIndex. Раньше я делал это в другом месте.

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

Ответ 5

Если в viewDidLoad имеется следующая строка, это может вызвать это сообщение. Прокомментируйте следующую строку.

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

(Вы можете отключить строку состояния из файла plist приложения).

Ответ 6

После нескольких тестов большое правило: "Не выполнять анимацию перед анимированным увольнением или анимированным шоу".

Например:

  • не вызывайте -dismissModalViewControllerAnimated:YES после обратного вызова делегирования UIAlertView -alertView: will DismissWithButtonIndex: (подождите, пока вы не выйдете из окна предупреждения, прежде чем делать это, используя -alertView: did DismissWithButtonIndex:)
  • не пытайтесь отобразить клавиатуру (becomeFirstResponder), прежде чем ваш контроллер просмотра появится на экране.

Плохие вещи могут случиться.

Надеюсь, это будет полезно; -)

Ответ 7

Вы сделали [textfield becomeFirstResponder];

И после того, как вы получите значение из текстового поля в своем коде, сделайте [textfield resignFirstResponder];. Это поможет вам, я думаю.

Ответ 8

Это сработало для меня, чтобы клавиатура отображалась сразу, без анимации или задержки.

Пусть 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];

Ответ 9

Если вы используете текущий симулятор iPhone 4.0, это сообщение об ошибке появляется часто при повороте экрана (или при анимации после поворота экрана), сопровождаемом задержкой 1-2 секунды в анимации.

Это ошибка в этой версии Симулятора и должна быть исправлена ​​в ближайшее время.

Ответ 11

переопределить viewDidappear, а не viewWillAppear:

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

Ответ 12

Я могу имитировать этот код один на один с помощью этого кода 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, и мои проблемы были решены. Может быть, это также относится к другим встречам?

Ответ 13

Также с UIAlertView. То, что решило это для меня, заключалось в том, чтобы уйти в отставку, как показано ниже, как упоминалось ранее в warehouselabs.

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

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

Другие делегаты UIAlertViewDelegate не устранили проблему.

Ответ 14

Проблемы в том, что в коде Apple есть условие гонки. Обычно это связано с неправильными обновлениями пользовательского интерфейса.

По моему опыту, вы либо не вызывали супер в viewDidAppear, viewWillAppear и т.д. Или вы пытаетесь отобразить UIAlertView в viewDidLoad или viewWillAppear.

Когда вы добавляете UIAlertView, фреймворк нуждается в ссылке на родительское представление. Но если вы находитесь в viewWillAppear или viewDidLoad, представление фактически не отображается... Вам следует рассмотреть возможность перемещения кода в viewDidAppear, где представление готово к использованию UIAlertView.

Ответ 15

Является ли текстовое поле содержащимся в этом представлении или внутри чего-то еще? Вы можете только отправить "startFirstRepsonder" на то, что содержится непосредственно в этом представлении. Если он хранится в каком-либо другом компоненте виджета, вы не должны устанавливать первый статус ответчика в этом виджете, а скорее в виджет, который создается. Например, если вы добавляете текстовое поле в представление предупреждения, потому что показ происходит асинхронно, возможно, оно не будет к тому времени, когда вы вызовете startFirstResponder. (В идеале у вас будет свой собственный класс просмотра предупреждений и определить текстовое поле внутри него, и когда этот вид получит viewDidAppear, вы должны установить текстовое поле в качестве первого ответчика в этой точке.)

Ответ 16

Я также получаю сообщение wait_fences: failed to receive reply: 10004003, а методы viewWill... и viewDid... ничего не делают, кроме как отправлять сообщения на super. В моем случае это случается, когда я показываю UIAlertView в моем GameViewController, и пользователь вместо этого нажимает кнопку iPhone round device, а затем возвращается в приложение. Это выглядит из моих рук.

Ответ 17

Alertview или таблицы действий должны отображаться в основных потоках... поэтому, если вы создаете любые синхронные соединения и выполняете эту операцию в другом потоке и показываете предупреждения на основе вывода, полученного от этой операции, вы получите это сообщение об ошибке wait_fences: не удалось получить ответ: 10004003. Вы можете сделать что-то вроде....

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

и показывать предупреждения в методе handleOutput, передавая строку выходного ответа в качестве параметра.

Ответ 18

Решение здесь!

У меня была такая же ошибка, теперь я получил решение, это может вам помочь.

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
  [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1];
}