wait_fences: не удалось получить ответ: ошибка 10004003 - UIAlert БЕЗ UITextField присутствует - PullRequest
9 голосов
/ 22 ноября 2010

Я работаю над приложением, в котором UIAlert появляется в первый раз, когда пользователь начинает использовать его, чтобы спросить, хотят ли они использовать свое текущее местоположение.Это происходит в главном контроллере.Тем не менее, я получаю следующую ошибку при использовании UIAlert:

wait_fences: failed to receive reply: 10004003

Я отладил его и погуглил.Я не использую текстовое поле или ввод с клавиатуры, поэтому мне не нужно отставку первого респондента.Тем не менее, я все еще не могу понять, почему я получаю эту ошибку.Появляется только когда я добавляю UIAlert.

MainController.m

- (void)viewDidLoad {

    UIAlertView *mainAlert = [[UIAlertView alloc]
                      initWithTitle:@"Location" 
                      message:@"Do you wish to use your current location?" 
                      delegate:self 
                      cancelButtonTitle:nil 
                      otherButtonTitles:@"No Thanks", @"Sure!", nil];

    [mainAlert show];
    [mainAlert release];

    [super viewDidLoad];
}

Заголовочный файл построен так:

@interface MainController : UIViewController 
<CLLocationManagerDelegate,
 MKReverseGeocoderDelegate, UIAlertViewDelegate>

Ответы [ 5 ]

17 голосов
/ 13 февраля 2012

Причиной этого wait_fences: failed to receive reply: также может быть то, что вы пытаетесь показать предупреждение, не находясь в mainThread (который является потоком GUI).

Помогает отправка в поток GUI:

dispatch_async(dispatch_get_main_queue(), ^{ 
  [mainAlert show];
});
8 голосов
/ 24 ноября 2010

Я решил эту проблему, добавив небольшую задержку в UIAlert: Ниже приведен метод ViewDidLoad (он также отлично работает в ViewDidAppear ):

[self performSelector:@selector(testAlert) withObject:nil afterDelay:0.1];

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

- (void) testAlert
{
    UIAlertView *mainAlert = [[UIAlertView alloc] initWithTitle:@"Location" message:@"Do you wish to use your current location?" delegate:self cancelButtonTitle:nil otherButtonTitles:@"No Thanks", @"Sure!", nil];

    [mainAlert show];
    [mainAlert release];
}
1 голос
/ 23 июня 2011

Всегда звоните [super viewDidLoad];, прежде чем делать что-либо еще. Это также объясняет, почему задержка работает.

Надеюсь, я прав. :)

0 голосов
/ 15 апреля 2013

У меня была похожая проблема.Я добавил наблюдателя в ViewDidLoad для уведомления о достижимости, которое было опубликовано до того, как ViewDidAppear был закончен.

Итак, ViewController пытался отобразить один UIAlertView до того, как его собственное представление было полностью нарисовано.

Я переместил добавление Observers в ViewDidAppear и запустил startNotifierдостижимость в ViewDidAppear.Также в коде пропущен вызов [super viewDidAppear].Обе эти проблемы были исправлены, приложение снова стало работать нормально.

Если вы получите это wait_fences: не удалось получить ответ: ошибка 10004003 один раз, вы не сможете больше представлять модальные ViewControllers в приложении.Это была проблема, с которой я столкнулся в своем приложении.Иногда при попытке представить один модальный ViewController приложение заходит в бесконечный цикл.

Как сказал Алан, всегда помните: «Попробуйте показать UIAlert в -viewDidAppear: (BOOL) animated. -ViewDidLoad вызывается, когдаВаше представление загружено, но до его отображения на экране. "

0 голосов
/ 22 ноября 2010

Попробуйте показать UIAlert в -viewDidAppear: (BOOL) анимированный. -viewDidLoad вызывается, когда ваше представление загружено, но до его отображения на экране.

...