Почему это не зацикливание цикла или выдача ошибок о вложенных анимациях? - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть цикл для проверки, находится ли расширение файла в массиве:

NSArray* validExtensions = [NSArray arrayWithObjects:@"jpg", @"jpeg", @"png", @"gif", nil];
for (NSString *ext in validExtensions) {
        NSLog(@"filePath: %@\n extension:%@", ext, filePath.pathExtension);
        if ([ext isEqualToString:[self.filePath pathExtension]]) {
            PhotoDetailView *detView = [[PhotoDetailView alloc] initWithNibName:@"PhotoDetailView" bundle:nil];
            detView.image = [UIImage imageWithContentsOfFile:self.filePath];
            [self.navigationController pushViewController:detView animated:YES];

        } else {
            DetailView *theDetail = [[DetailView alloc] initWithNibName:@"DetailView" bundle:nil];
            theDetail.title  = self.fileName;
            self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"My Files" style:UIBarButtonItemStyleBordered target:nil action:nil] autorelease];
            theDetail.textString = self.filePath;
            [self.navigationController pushViewController:theDetail animated:YES];

        }
    }

По какой-то причине, если после if и else я поставил break;, он просто совпадает с jpg записью в массиве. Если я его удаляю, я получаю странные сведения о вложенных анимациях в журнале, и меняются несколько представлений:

  • Завершение перехода в непредвиденное состояние. Дерево подпредставлений панели навигации может быть повреждено.
  • Несбалансированные вызовы для начала / окончания появления переходов для.
  • вложенная анимация push может привести к повреждению панели навигации

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 19 ноября 2011

Хотя это не совсем отвечает на ваш вопрос, есть гораздо лучший способ проверить, является ли определенный файл изображением, которое может обрабатывать система, чем просто проверка расширения файла.

Что вам нужносделать, это проверить универсальный идентификатор типа файла и убедиться, что он соответствует public.image UTI:

//assume fileURL is an NSURL pointing to the file to test
NSString* fileUTI = nil;
NSError* error;
if(![fileURL getResourceValue:&UTIString forKey:NSURLTypeIdentifierKey error:&error])
{
    //handle error
    return;
}
if(UTTypeConformsTo((__bridge CFStringRef)fileUTI, CFSTR("public.image"))
{
    NSLog(@"File at %@ is an image", fileURL);
}
1 голос
/ 19 ноября 2011

Я не уверен, что вы ожидали при использовании break внутри цикла for, за исключением того, что он должен разорвать цикл (выйти без перехода к следующему элементу). Итак ... первый раз с вашим первым элементом (@ "jpg"), где он что-то делает, затем останавливается.

Кроме того, ваш код вообще не выполняет то, что вы сказали, что он делает. Вы сказали: «У меня есть цикл для проверки, находится ли расширение файла в массиве», но ваш код фактически создает массив расширений файлов и пытается выполнить навигацию для каждого из них.

Если я не пропустил вашу мысль, я не думаю, что вы хотите цикл for. Я думаю, что вы хотите получить ваше расширение, где бы оно вам ни понадобилось (какое-то выбранное имя файла?), А затем просто спросить массив validExtensions, содержит ли он расширение вашего файла:

if ([validExtensions containsObject:someExtension])
{
  // navigate to the photo detail / @"PhotoDetailView" view
} else {
  // navigate to the detail / @"My Files" view
}

Ключевым отличием является то, что вы теперь спрашиваете массив, содержит ли он объект (расширение), а не зацикливает массив, находит совпадение и пытается разорвать его. Это ошибка вашего дизайна.

Ваша ошибка (что вызывает несколько переходов и связанных с ними записей журнала) заключается в том, что вы нажимаете каждое допустимое расширение, переходя к любому виду подробных фотографий, если оно соответствует вашему расширению файла, или ваше представление «Мои файлы», если нет ... и вы делаете это для каждой записи в допустимом массиве расширений , что приводит к четырем переходам.

Если я не правильно понял, обновите ваш вопрос, чтобы уточнить общую цель.

...