J'ai un problème très étrange lors de l'utilisation de ce UIAlertView. Lorsque vous consultez un médecin, ils ont plusieurs bureaux. En sélectionnant un, vous obtenez une alerte qui vous propose d'appeler cet emplacement ou de l'afficher sur une carte. Pour créer l'alerte et avoir des données à portée de main lorsque l'alerte est rejetée, j'ai déclaré 4 NSStrings (bien que je n'ai probablement besoin que de 2) dans le fichier d'en-tête. (alertTitle, alertText, alertNumber et alertAddress)Problème avec NSStrings et UIAlertView
Lorsque vous examinez le code, le problème est l'endroit où alertAddress est impliqué. Gardez également alertNumber à l'esprit. J'ai eu beaucoup de ce code condensé, mais l'ai élargi pour m'aider à trouver le problème!
-(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];
}
Tout va bien jusqu'à ce que nous atteignions le point où nous gérons le renvoi d'alerte. alertNumber semble très bien, je peux l'utiliser pour déclencher l'appel téléphonique et le connecter à la console. Toutefois, alertAddress n'est pas du tout content de faire la même chose. même en essayant de le connecter à la console provoque un EXC_BAD_ACCESS. alertAddress enregistre correctement les données avant que l'alerte ne soit en cause, mais l'accès à ces données lors de la gestion du bouton d'alerte entraîne un problème. J'ai même utilisé le numéro d'alerte, il est en place et le code fonctionne parfaitement.
Pourquoi les deux mêmes variables NSString se comportent-elles différemment si elles sont utilisées exactement de la même manière?
- (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]]];
}
}
Voici les déclarations connexes dans le fichier d'en-tête trop ...
@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;
...
Et est ici la sortie de la console au cours de ce processus, si elle aide ....
> 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
-t-il fonctionner si vous utilisez l'accesseur? La cause juste alertAddress est en train d'être définie sur une variable auto-libérée. – blindjesse
Ne devrait-il pas être conservé comme spécifié dans le fichier d'en-tête? Dealloc ne me pose aucun problème quand je vais le publier là-bas. Donc, je ne pense pas qu'il soit autoreleased. Même si je devais mettre alertAddress = @ "BLEH"; il échoue toujours lorsqu'il est accédé via le bouton d'alerte, appuyez sur/ignorer. – TheHockeyGeek