У меня проблема со строкой, содержащей закодированные символы. В частности, если строка содержит закодированные символы, она в конечном итоге становится недействительной, а "нормальная" строка - нет.
в файле .h:
@interface DirViewController : TTThumbsViewController
<UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
{
NSString *sourceFolder;
NSString *encodedSourceFolder;
}
@property (nonatomic, retain) NSString *sourceFolder;
@property (nonatomic, retain) NSString *encodedSourceFolder;
в файле .m:
- (id)initWithFolder:(NSString*)folder query:(NSDictionary*)query {
if (self = [super init]) {
sourceFolder = folder;
}
return self;
}
До сих пор все, кажется, работает как ожидалось. В viewDidLoad у меня есть следующее:
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;
Который использует следующий метод для кодирования строки (если он содержит символы, которые я хочу закодировать):
- (NSString *)urlEncodeValue:(NSString *)str {
NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes (kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
return [result autorelease];
}
Если я получу результат NSLog, я получу ожидаемые значения. Если строка содержит символы, такие как пробел, я получаю строку с кодировкой. Если в строке нет символов, которые нужно кодировать, она просто выдаст мне исходную строку.
У меня есть кнопка на панели навигации, которая начинает процесс импорта изображений, открывая лист действий. После запуска метода для листа действий моя строка недействительна - но только если она содержит закодированные символы. Если это просто «нормальная» строка, все в порядке и работает как ожидалось. Я отключил кодировку? Сначала я подумал, что это может быть проблема с памятью, но я не могу понять, почему это повлияет только на кодированные строки.
Вот где лист действий определен (и первое, что я вижу, что закодированная строка становится недействительной), где операторы NSLog терпят крах:
- (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];
}
}
Я не получаю никаких сообщений о сбоях при переходе на консоль. Используя точки останова, я смог увидеть, что encodedSourceFolder недопустим в методе листа действий.