Obj-C: приложение: openFiles: (несколько файлов удалено) не получает все файлы. Ошибка?

Ближайший из них, который я нашел, это: questions/4778932/cocoa-app-not-receive-all-dropped-files-in-applicationopenfiles Но на него никто не ответил.

Моя проблема в том, что, скажем, я бросаю 4 файла в свое док-приложение:

  • тест.xls
  • тест.rtf
  • тест.jpg
  • тест.pdf


Если я иду отлаживать свою программу, она показывает это:

Журнал отладки

Как видите, файла .jpg там нет. Это также происходит для: .py, других типов изображений, файлов .txt. Я обнаружил, что если я удаляю файлы только из этой группы (.py .jpg .txt), то он распознает их все.

Мой Info.plist выглядит так:

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEplistPUBLIC"-//Apple//DTDPLIST1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plistversion="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>AllFiles</string>
<key>CFBundleTypeIconFile</key>
<string>application.icns</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>public.item</string>
</array>
</dict>
</array>

Я не знаю, где здесь ошибка, может быть, это ошибка? Или я неправильно настроил свой info.plist?

Я надеюсь, что кто-то может мне помочь, и спасибо всем заранее!


person Zate    schedule 02.12.2015    source источник


Ответы (2)


установить в info.plist вот так

<key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeExtensions</key>
            <array>
                <string>*</string>
            </array>
            <key>CFBundleTypeName</key>
            <string>Files</string>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>public.data</string>
            </array>
        </dict>
    </array>

и используйте этот метод в AppDelegate.m

-(void)application:(NSApplication *)sender openFiles:(NSArray *)fileList{
 // use fileList array 
}

-(BOOL)application:(NSApplication *)sender openFile:(NSString *)filename{
    return YES;
}
person ERbittuu    schedule 02.12.2015
comment
Спасибо за ваш ответ! Я изменил свой info.plist, как и ваш, но у него все та же проблема. Я использую этот метод: - (void)application:(NSApplication *)theApplication openFiles:(NSArray‹NSString *› *)filenames{ - person Zate; 02.12.2015
comment
если вы установите так, то он должен работать ‹key›LSItemContentTypes‹/key› ‹array› ‹string›public.data‹/string› ‹/array› - person ERbittuu; 02.12.2015
comment
Вы также можете добавить сюда тип файла. как только изображение, pdf или только папки или что-нибудь еще. - person ERbittuu; 02.12.2015
comment
Я скопировал именно ваш фрагмент info.plist, но он все равно не работает. Он принимает все типы файлов, но, например. не .jpg и .rtf вместе. Тогда он будет распознавать только файл .rtf, .jpg будет игнорироваться, и я не знаю, почему. - person Zate; 02.12.2015
comment
Здесь некоторое время файлы попадают один за другим в несколько файловых групп. например, если вы перетащите несколько файлов, этот метод может вызываться несколько раз. но он даст весь список файлов. - person ERbittuu; 02.12.2015
comment
Я не уверен, правильно ли я вас понял. Если я перетащу, например. 10 файлов (только .jpg), то в массиве 10 объектов. Но тогда, если я перетащу, например. 12 файлов (10 .jpg, 1 .rtf, 1.xml) будут отображаться только 2 объекта: файл .xml и файл .rtf. Все 10 файлов .jpg будут проигнорированы (почему?). Это работает, но почему-то файлы .py .txt и изображения вызывают проблемы. - person Zate; 02.12.2015
comment
что я пытаюсь сказать. вы получите весь список файлов. просто подождите -(void)application:(NSApplication *)sender openFiles:(NSArray *)fileList этот метод будет вызываться несколько раз. и вы можете получить весь список в нескольких группах. - person ERbittuu; 02.12.2015
comment
Ок, спасибо, попробую. И для нескольких групп, могу ли я объединить эти группы в одну группу? - person Zate; 02.12.2015
comment
Да, создайте один глобальный изменяемый массив и добавьте этот список в этот массив по одному. - person ERbittuu; 02.12.2015
comment
-(void)application:(NSApplication *)sender openFiles:(NSArray *)fileList Будет вызываться несколько раз при перетаскивании 12 файлов (вы говорите), и вы получите все файлы - person ERbittuu; 02.12.2015
comment
У меня было [прекращение NSApp] в этом методе, который вызвал проблему. Ваше решение было правильным, спасибо. - person Zate; 02.12.2015
comment
Эй, не могли бы вы также сказать мне, как завершить мое приложение, если метод openFiles:(NSArray *)fileList завершен со ВСЕМИ типами файлов? Кажется, для этого нет обработчиков событий. - person Zate; 02.12.2015
comment
Возможно, вам потребуется создать один глобальный массив и добавить в него список файлов. В конце этого метода вы должны проверить, что массив содержит весь список типов файлов, а затем завершить приложение, в противном случае продолжить. - person ERbittuu; 02.12.2015
comment
Да, но проблема в том, как проверить, обработаны ли все списки типов файлов? Есть ли способ узнать, сколько групп существует? - person Zate; 03.12.2015
comment
Это довольно глупое поведение с Apple Events, если вы спросите меня. Имея ту же проблему. Если одновременно открыто 40 файлов, почему приложение не может просто получить эти 40 файлов как событие за один раз? Это единичное событие. - person svth; 06.05.2017

Я столкнулся с той же проблемой, и вот как я ее решил:

@property (strong) NSMutableArray *openFilesList;
@property (strong) NSTimer *openFilesTimer;

...

@synthesize openFilesList;
@synthesize openFilesTimer;

...

-(void)init {
    openFilesList = [[NSMutableArray alloc] init];
    openFilesTimer = nil;
}

-(void)application:(NSApplication *)sender openFiles:(NSArray *)filenames {
    if (openFilesTimer) {
        [openFilesTimer invalidate];
    }
    [openFilesList addObjectsFromArray:filenames];
    openFilesTimer = [NSTimer scheduledTimerWithTimeInterval:0.2f
                                                      target:self
                                                    selector:@selector(processOpenFiles)
                                                    userInfo:nil
                                                     repeats:NO];
}

-(void)processOpenFiles {
    NSArray *filenames = [openFilesList copy];
    openFilesTimer = nil;
    [openFilesList removeAllObjects];

    // Do your processing with filenames
}
person Kuro    schedule 07.12.2015
comment
Прежде всего, спасибо, это именно то, что я собирался сделать дальше. Я столкнулся с еще одним странным поведением с файлами tar.gz, он попадает в одну группу, и если я перетаскиваю 3 файла из 3 разных групп (.jpg / .rtf / .tar.gz), он обрабатывает только 2 из этих групп. Есть идеи? - person Zate; 10.12.2015
comment
Определены ли все три расширения файлов в вашем файле info.plist? - person Kuro; 10.12.2015