Закрыть nsopenpanel, как только файл/каталог был выбран

StackOverflow https://stackoverflow.com/questions/4688925

  •  11-10-2019
  •  | 
  •  

Вопрос

Я новичок в NsopenPanel/NSSavePanel/NSPANEL. Я использую nsopenpanel для выбора каталога, файлы которого мое приложение будет повторяться и выполнять довольно трудоемкую обработку.

Я могу позвонить -Клоуз на панели, но это не возвращает фокус в главное окно. Я много читал о «увольнении» панели, но я не нашел никаких методов, которые «увольняют», а не «закрывают» панель или окно.

Просто мне нужно породить фоновый поток (применение)?

Это то, что мой -хозвуководад: returncode: contextInfo:

-(void) chooseDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo
    {
    [panel orderOut:self];
    [panel release];

    if (returnCode == NSFileHandlingPanelOKButton)
        {
        [progressIndicator startAnimation:self];
        [self doLotsOfTimeConsumingWork:[[panel URL] path]];
        [progressIndicator stopAnimation:self];
        }
    }

В то время как nsopenpanel действительно уходит, мой nsprogressindicator не оживляет, а главное окно не оживает, пока после -Долотсофунсосусформиссии: завершает.

Обновлять Просто посмотрел на код NSOperationsample, и выглядит так, как будто это путь.

Это было полезно?

Решение

Две заметки:

Во -первых, в какао обращение и рисунок событий происходит в главной нити. Следовательно, никогда не бывает хорошей идеей, чтобы синхронно вызовать длинные методы (что является причиной вашего не ответа пользователя).
Так что да, вы должны передавать вычислительно дорогие задачи вторичному потоку из этого метода, как из любого IBAction.

Во -вторых, звонок [panel release] В этом методе нарушают правила владения объектом какао! Поэтому, если вы будете утекать панель без этого вызова, вы должны исправить это в методе, где вы создаете панель.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top