#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 готово.