Имам много странен проблем, когато използвам този UIAlertView. При преглед на лекар има няколко кабинета. След като изберете такъв, получавате предупреждение, което предлага да се обадите на това местоположение или да го покажете на карта. За да създам предупреждението и да имам готови данни, когато предупреждението бъде отхвърлено, декларирах 4 NSStrings (въпреки че вероятно имам нужда само от 2) в заглавния файл. (alertTitle, alertText, alertNumber и alertAddress)
Когато разглеждаме кода, проблемът е къде е включен alertAddress. Също така имайте предвид alertNumber. Съкратих много от този код, но го разширих, за да си помогна да открия проблема!
-(IBAction)address1ButtonPressed:(id) sender {
Formatter *pnf = [Formatter alloc];
alertTitle = [physician objectForKey:ADDRESS1DESC_KEY];
NSString *a = [physician objectForKey:ADDRESS1A_KEY];
NSString *b =[physician objectForKey:ADDRESS1CITY_KEY];
NSString *c =[physician objectForKey:ADDRESS1STATE_KEY];
NSString *d = [physician objectForKey:ADDRESS1ZIP_KEY];
NSString *p = [physician objectForKey:PHONE1A_KEY];
alertAddress = [[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@,+%@,+%@+%@",a,b,c,d] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",alertAddress);
alertText = [NSString stringWithFormat:@"%@\n%@, %@ %@\n%@",a,b,c,d,[pnf stringFromPhoneNumber:p]];
alertNumber = [p stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
[pnf release];
UIAlertView *phoneAlert = [[UIAlertView alloc] initWithTitle:alertTitle message:alertText delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call",@"View Map",nil];
[phoneAlert show];
}
Всичко е наред, докато стигнем до точката, в която се справяме с отхвърлянето на предупреждението. alertNumber изглежда се среща добре, мога да го използвам, за да задействам телефонното обаждане и да го регистрирам в конзолата.
alertAddress обаче изобщо не е доволен да прави същото. дори опитът да го регистрирате в конзолата причинява EXC_BAD_ACCESS. alertAddress регистрира данните правилно, преди да се включи предупреждението, но достъпът до тези данни изобщо при обработка на отхвърлянето на бутона за предупреждение причинява проблем. Дори използвах alertNumber, той е мястото и кодът функционира перфектно.
Защо и двете същите NSString променливи се държат толкова различно, когато се използват по същия начин?
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) {
NSLog(@"Dialing: %@",alertNumber);
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@",alertNumber]]];
}
if (buttonIndex == 2) {
NSLog(@"Map Selected");
NSLog(@"alertAddress contains: %@",alertAddress);
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@",alertAddress]]];
}
}
Ето и свързаните декларации в заглавния файл...
@interface PhysicianDetailViewController: UIViewController {
...
NSString *alertTitle;
NSString *alertText;
NSString *alertNumber;
NSString *alertAddress;
...
}
@property (nonatomic, retain) NSString *alertTitle;
@property (nonatomic, retain) NSString *alertText;
@property (nonatomic, retain) NSString *alertNumber;
@property (nonatomic, retain) NSString *alertAddress;
...
И ето изхода на конзолата по време на този процес, ако помага....
> 2010-10-29 11:09:17.954 [2672:307] http://maps.google.com/maps?q=123%20Main%20Street%0ASuite%20A,+Tampa,+FL+11111
> 2010-10-29 11:09:21.657 [2672:307] Map Selected
> Program received signal: “EXC_BAD_ACCESS”.
> kill quit