stringByReplacingOccurenceOfString завершается ошибкой - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь создать приложение для Mac OS X, которое запрашивает у пользователя каталог. Я использую NSOpenPanel, которая срабатывает, когда пользователь нажимает кнопку «Обзор».

Проблема в том, что [NSOpenPanel filenames] устарела, так что теперь я использую функцию URLs. Я хочу разобрать материал, который связан с URL, просто чтобы получить нормальный путь к файлу. Поэтому я попытался fileName = [fileName stringByReplacingOccurrencesOfString:@"%%20" withString:@" "];, но это дало мне ошибку:

-[NSURL stringByReplacingOccurrencesOfString:withString:]: unrecognized selector sent to instance 0x100521fa0

Вот весь метод:

- (void) browse:(id)sender
{
    int i; // Loop counter.

    // Create the File Open Dialog class.
    NSOpenPanel* openDlg = [NSOpenPanel openPanel];

    // Enable the selection of files in the dialog.
    [openDlg setCanChooseFiles:NO];

    // Enable the selection of directories in the dialog.
    [openDlg setCanChooseDirectories:YES];

    // Display the dialog.  If the OK button was pressed,
    // process the files.
    if ( [openDlg runModal] == NSOKButton )
    {
        // Get an array containing the full filenames of all
        // files and directories selected.
        NSArray* files = [openDlg URLs];

        // Loop through all the files and process them.
        for( i = 0; i < [files count]; i++ )
        {
            NSString* fileName = (NSString*)[files objectAtIndex:i];
            NSLog(@"%@", fileName);

            // Do something with the filename.
            fileName = [fileName stringByReplacingOccurrencesOfString:@"%%20" withString:@" "];

            NSLog(@"%@", fileName);
            NSLog(@"Foo");
            [oldJarLocation setStringValue:fileName];
            [self preparePopUpButton];
        }
    }
}

Интересно, что "Foo" никогда не выводится на эту консоль. Это похоже на прерывание метода в строке stringByReplacigOccurencesOfString.

Если я удалю эту строку, приложение запустится и заполнит мое текстовое поле строкой, просто в форме URL, которая мне не нужна.

1 Ответ

1 голос
/ 10 октября 2011

Ваша проблема в том, что NSArray, возвращаемый [NSOpenPanel URLs], содержит NSURL объекты, а не NSString объекты. Вы выполняете следующий актерский состав:

 NSString* fileName = (NSString*)[files objectAtIndex:i];

Поскольку NSArray возвращает id, нет никакой проверки во время компиляции, чтобы убедиться, что ваше приведение имеет смысл, но вы получаете ошибку времени выполнения, когда пытаетесь отправить селектор NSString тому, что на самом деле NSURL.

Вы можете преобразовать объекты NSURL в NSString и использовать свой код в основном как есть, но вам не нужно самостоятельно обрабатывать URL-декодирование. NSURL уже имеет метод для извлечения части пути, который также отменяет кодирование процентов: path.

NSString *filePath = [yourUrl path];

Даже если ваш код был , имеющий дело только с кодированным процентом NSString, theres stringByReplacingPercentEscapesUsingEncoding:.

...