Я получаю странное поведение от NSAlert в двух разных частях моей программы. Поведение:
- Оповещение появляется, а затем самопроизвольно исчезает.
- Оповещение появляется снова и затем остается до тех пор, пока пользователь не отклонит его, т. Е. Нормальное поведение.
- Оповещение появляется снова.
Это происходит только при первом вызове метода, который отображает предупреждение. После этого в первый раз он ведет себя нормально.
Вот код для одной из частей, в которой происходит поведение:
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;
Таким образом, он отлично работает.