Je rencontre un problème avec une chaîne contenant des caractères codés. Plus précisément, si la chaîne a des caractères codés, elle finit par devenir invalide alors qu'une chaîne "normale" ne le sera pas.La chaîne nsstring codée devient invalide, nsstring "normal" reste
dans le fichier .h:
@interface DirViewController : TTThumbsViewController
<UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
{
NSString *sourceFolder;
NSString *encodedSourceFolder;
}
@property (nonatomic, retain) NSString *sourceFolder;
@property (nonatomic, retain) NSString *encodedSourceFolder;
dans le fichier .m:
- (id)initWithFolder:(NSString*)folder query:(NSDictionary*)query {
if (self = [super init]) {
sourceFolder = folder;
}
return self;
}
Jusqu'à présent, tout semble fonctionner comme prévu. En viewDidLoad je donne les résultats suivants:
sourceFolderCopy = [self urlEncodeValue:(sourceFolder)];
//I also have this button, which I'll refer to later:
UIBarButtonItem *importButton = [[UIBarButtonItem alloc] initWithTitle:@"Import/Export" style:UIBarButtonItemStyleBordered
target:self
action:@selector(importFiles:)];
self.navigationItem.rightBarButtonItem = importButton;
qui utilise la méthode suivante pour encoder la chaîne (si elle a des caractères Je veux encodée):
- (NSString *)urlEncodeValue:(NSString *)str {
NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes (kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
return [result autorelease];
}
Si le résultat que je NSLog, je reçois les valeurs attendues . Si la chaîne a des caractères comme un espace blanc, j'obtiens une chaîne avec un encodage. Si la chaîne n'a pas de caractères à coder, elle me donne simplement la chaîne d'origine.
J'ai un bouton sur la barre de navigation qui commence un processus d'importation d'image en ouvrant une feuille d'action. Une fois que la méthode pour la feuille d'action commence, ma chaîne n'est pas valide - mais seulement si elle contient des caractères codés. Si c'est juste une chaîne "normale", tout va bien et agit comme prévu. Suis-je sur mon encodage? Au début, je pensais que c'était peut-être un problème de mémoire, mais je n'arrive pas à comprendre pourquoi cela affecterait uniquement les chaînes codées.
est ici où la feuille d'action est définie (et la première place que je peux voir la chaîne encodée devient invalide) les déclarations NSLog sont là où il se bloque:
- (IBAction)importFiles:(id)sender {
NSLog(@"logging encodedSF from import files:");
NSLog(@"%@",encodedSourceFolder);//crashes right here
NSLog(@"%@",sourceFolder);
if (shouldNavigate == NO)
{
NSString *msg = nil;
msg = @"It is not possible to import or export images while in image selection mode.";
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Unable to Import/Export"
message:msg
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
[msg release];
}
else{
UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:@"What would you like to do?"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Import Photos (Picker)", @"Export Photos", nil, nil];
[actionSheet showInView:self.view];
[actionSheet release];
}
}
Je ne reçois pas d'erreur d'accident va la console. En utilisant des points d'arrêt, j'ai pu voir que le fichier encodedSourceFolder n'est pas valide dans la méthode de feuille d'action.
vous pouvez également utiliser « sourcefolder = [[NSString alloc] initWithString :dossier];" – schaechtele
sourceFolder = [copie de dossier]; résulte dans le même comportement. Une chaîne avec des caractères codés devient invalide au même endroit alors qu'une chaîne sans caractères codés reste. – shoreline
sourceFolder = [[NSString alloc] initWithString: dossier]; entraîne également le comportement dans le message original. – shoreline