Mac OS 10.14 NSTextField в Sheet не будет программно обновляться после отображения листа

#cocoa #macos-catalina #macos-mojave

#cocoa #macos-catalina #macos-mojave

Вопрос:

У меня есть NSPanel, которую я отображаю в виде листа с помощью nswindow:beginsheet:completionhandler: .

Как только оно отобразится, я изменяю NSTextField в NSPanel с помощью setStringValue .

Это работает в версиях 10.12 и 10.13, но не в версиях 10.14 , где NSTextField не может измениться после отображения листа.

Есть идеи, почему или как это исправить в версии 10.14 ? Я не могу найти ничего подходящего в примечаниях к выпуску 10.14.

Вот соответствующий код:

 // Declarations

NSWindow *thisWindow;
IBOutlet NSPanel *progressPanel;
IBOutlet NSTextField *progressText;


// Show the sheet

[thisWindow beginSheet:progressPanel completionHandler:^(NSModalResponse returnCode) {
    }];

// Update the NSTextField

- (void) progressSetData: (NSString *) data
{
    [progressText setStringValue:data];
    progressText.needsDisplay = YES;
    [progressPanel display];
}
  

Комментарии:

1. Пожалуйста, опубликуйте свой код.

2. Проблема заключается в другом. Докажите, что вы вызываете progressSetData , пожалуйста. Покажите достаточно кода, чтобы сделать проблему воспроизводимой , если вам нужна помощь. (Кстати, вы не должны вызывать display . Вам также не нужно говорить, что текстовое поле нуждается в отображении. Он знает, что делать, когда вы устанавливаете его строковое значение.)

3. У меня нет способа доказать ВАМ, что оно вызывается. Я доказал это самому себе, установив точку останова. Кроме того, код работает с или без необходимости отображения в версиях 10.12 и 10.13. Я только что добавил needsDisplay и display as atempts (сбой), чтобы заставить это работать на 10.14 .

4. Вы правы, что проблема в другом месте. Я повторил вышесказанное без каких-либо других действий, и действительно, текстовое поле изменяется после отображения. В моем приложении происходит копирование данных с помощью NSFileManager. Я все еще сомневаюсь, является ли это проблемой. progressSetData вызывается между копиями.

5. Конечно же, запустив [[NSFileManager defaultManager] copyItemAtPath: … промежуточные вызовы progressSetData не приводят к изменению NSTextField. Итак, я подумал, что проблема может заключаться в том, что дисковая активность была в основном потоке, но даже если я использовал Grand Central dispatch для копирования с dispatch_async,, затем дождитесь завершения копирования, NSTextField не изменится, пока все copying…anywhere…is готово.