UIAlertView выскакивает три раза за звонок вместо одного раза - PullRequest
2 голосов
/ 16 февраля 2010

Я получаю странное поведение от NSAlert в двух разных частях моей программы. Поведение:

  1. Оповещение появляется, а затем самопроизвольно исчезает.
  2. Оповещение появляется снова и затем остается до тех пор, пока пользователь не отклонит его, т. Е. Нормальное поведение.
  3. Оповещение появляется снова.

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

Вот код для одной из частей, в которой происходит поведение:

UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [locationAlert show];
        [locationAlert release];

Или, если хотите, с немного большим контекстом:

- (IBAction)locateMe {
NSLog(@"About to check location");
locMan = [[CLLocationManager alloc] init];
locMan.delegate = self;
locMan.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
locMan.distanceFilter = 1609; //1 mile
[locMan startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation * )oldLocation {
if (newLocation.horizontalAccuracy >= 0) {

    CLLocation *airportLocation = [[[CLLocation alloc] initWithLatitude:51.500148 longitude:-0.204669] autorelease];
    CLLocationDistance delta = [airportLocation getDistanceFrom: newLocation];
    long miles = (delta * 0.000621371) + 0.5; //metres to rounded mile
    if (miles < 3) {
        UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [locationAlert show];
        [locationAlert release];
        [locMan stopUpdatingLocation];
    } else {
        UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are not in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [locationAlert show];
        [locationAlert release];
        [locMan stopUpdatingLocation];

    }
}
}

- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"Error." message:error.code delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

[locationAlert show];
[locMan release];
locMan = nil;
}

Есть идеи? Спасибо.

Редактировать ---------

Другое место, где это происходит:

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSString * errorString = [NSString stringWithFormat:@"Unable to download feed from web site (Error code %i )", [parseError code]];
NSLog(@"error parsing XML: %@", errorString);

UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[errorAlert show];
}

Для контекста первый случай находится в AppDelegate, а второй - в контроллере представления для первого представления вкладки. Вторая проблема возникает каждый раз, когда XML перезагружается, когда нет подключения к Интернету. Первый происходит только при первом вызове функции.

Редактировать -----

Если я переместу предупреждение, оно сработает. К сожалению, это не то место, где я хочу!

- (IBAction)locateMe {

 UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[locationAlert show];
/*
NSLog(@"About to check location");
locMan = [[CLLocationManager alloc] init];
locMan.delegate = self;
locMan.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
locMan.distanceFilter = 1609; //1 mile
[locMan startUpdatingLocation];*/
}

Обновление:

Я установил несколько записей NSLog и обнаружил, что, несмотря на добавление [locMan stopUpdatingLocation], функция didUpdateToLocation выполнялась несколько раз.

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

Любые идеи относительно того, почему [locMan stopUpdatingLocation] не работает, приветствуются, но в то же время я просто переместил объявление locationAlert из функции (поэтому оно является глобальным), установил его в исходной функции locate me. и используйте следующий раз, когда это называется:

[locationAlert show];
locationAlert = nil;

Таким образом, он отлично работает.

Ответы [ 5 ]

2 голосов
/ 16 февраля 2010

Вы не выключаете свой менеджер местоположения, когда впервые показываете предупреждение. Поскольку местоположение уточняется устройством (т. Е. Точность увеличивается), ваш обратный вызов будет (потенциально) вызываться несколько раз. Вы должны использовать [locMan stopUpdatingLocation] после отображения вашего предупреждения.

1 голос
/ 16 февраля 2010

Я установил несколько записей NSLog и обнаружил, что, несмотря на добавление [locMan stopUpdatingLocation], функция didUpdateToLocation выполнялась несколько раз.

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

Любые идеи относительно того, почему [locMan stopUpdatingLocation] не работает, были бы оценены, но в то же время я просто переместил объявление locationAlert из функции (поэтому оно является глобальным), установил его в исходное местоположение при первом вызове используйте следующее:

[locationAlert show];
locationAlert = nil;

Таким образом, он отлично работает.

0 голосов
/ 03 октября 2013

У меня также возникла та же проблема при работе с Location Manager. Здесь я проверил с помощью Nslog, но он выполняется несколько раз, наконец, я обнаружил, что я создаю несколько объектов и использую Sharedinstance для одного и того же ViewController, который содержит Location Manger, но я не освобождаю объект, так что в расположении в перкулярной области, сколько объектов, если мы создаем это много раз обнаруживает местоположение. Так что во время работы над LocationManger тщательно проверяйте объекты, чтобы избежать проблем такого типа.

0 голосов
/ 08 июля 2011

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

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if([string isEqualToString:@"OK"]) {
    NSLog(@"(Settings)Registration Successful");
    statusField.text = @"Registration successful!";
    [settingsActivity stopAnimating];
}
else {
    NSLog(@"(Settings)Registration Failure");
    [settingsActivity stopAnimating];

    UIAlertView * regFail = [[[UIAlertView alloc] initWithTitle:@"Registration Error!" message:@"Please check your email address and try again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease];

    [regFail show];
}}

Чтобы исправить это поведение, я просто проверил возвращаемую строку, а не просто показал предупреждение:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if([string isEqualToString:@"OK"]) {
    NSLog(@"(Settings)Registration Successful");
    statusField.text = @"Registration successful!";
    [settingsActivity stopAnimating];
}
else if([string isEqualToString:@"Error"]) {
    NSLog(@"(Settings)Registration Failure");
    [settingsActivity stopAnimating];

    UIAlertView * regFail = [[[UIAlertView alloc] initWithTitle:@"Registration Error!" message:@"Please check your email address and try again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease];

    [regFail show];
}
0 голосов
/ 16 февраля 2010

Я думаю, что NSAlert исчезает сам по себе является ключом к решению этой проблемы.

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

Для отладки предлагаю:

(1) Посмотрите в своем коде метод NSAlert – dismissWithClickedButtonIndex:animated: и посмотрите, действительно ли каким-то образом вы фактически отклонили предупреждение.

(2) Я полагаю (кто-то дважды проверяет меня по этому вопросу), что представление предупреждений добавляется в качестве подпредставления к любому основному представлению, которое в данный момент находится на экране. Возможно, что базовое представление по какой-то причине исчезает и принимает представление с предупреждением. Если представление исчезает, а затем появляется достаточно быстро, это может быть неочевидно, когда предупреждение находится на первом плане. (Изменить: см. Комментарий Эд Марти ниже.)

(3) Поскольку это происходит в двух отдельных частях приложения, сравните обе, чтобы найти общий элемент или структуру. Этот общий элемент может быть причиной. Странная проблема.

Edit01: Обновлено для дополнительной информации

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

...