Приложение Cocoa не загружает представления или не запускает код в High Sierra

У меня есть приложение в Mac AppStore, и многие пользователи недавно написали, что оно не работает на High Sierra (возможно, 10.13.6, из них сложно извлечь конкретную информацию). Мне удалось воспроизвести проблему на устройстве друга, однако я не смогу использовать это устройство для сборки с помощью Xcode и т. д.

Кажется, проблема в том, что NSViewController вообще не загружает свои подвиды! Контроллер серого цвета, показанный ниже, должен иметь раскрывающиеся списки и кнопки в это. ошибка

Я также заметил, что закрытие серого окна не закрывает красное прозрачное окно - в Мохаве код для этого работает, как и ожидалось. Пользовательский ярлык/элемент меню в строке состояния также не запускает код, к которому он привязан. Обратите внимание, что красное окно представлено кодом из серого окна, поэтому какой-то код работает.

В этой неясной ветке упоминается та же проблема, что и в этот вопрос. Однако ни один из них не требует программного решения.

Кто-нибудь знает, как это исправить, или мне нужно сказать своим пользователям обновить свою ОС?

Редактировать: удалось скомпилировать в High Sierra, но представления по-прежнему не отображаются (и в отладчике представлений их нет). Консоль говорит:

2019-02-02 16:53:41.602178+1100 Translate This[20410:36446120] -[NSMenu setItemArray:]: unrecognized selector sent to instance 0x604000069180
2019-02-02 16:53:41.602366+1100 Translate This[20410:36446120] Failed to set (contentViewController) user defined inspected property on (NSWindow): -[NSMenu setItemArray:]: unrecognized selector sent to instance 0x604000069180
2019-02-02 16:54:57.678247+1100 Translate This[20410:36446120] -[NSStoryboard _bundle]: unrecognized selector sent to instance 0x600000000660
2019-02-02 16:54:57.728849+1100 Translate This[20410:36446120] -[NSStoryboard _bundle]: unrecognized selector sent to instance 0x600000000660

0x604000069180 это NSMenu. Я явно не делаю ни одну из вещей, описанных в выводе консоли в моем коде.


person Max Chuquimia    schedule 31.01.2019    source источник
comment
Трудно сказать без кода, но я рекомендую вам установить все поддерживаемые ОС (поддерживаемые вашим приложением) и всегда проверять ваше приложение на них. Или, если у вас нет более старой системы, не устанавливайте цель развертывания для вашего проекта старше, чем ваша фактическая. Вы можете разбить свой диск на разделы меньшего размера с другими системами или иметь внешний диск с разделами, содержащими эти установленные ОС.   -  person Gergely    schedule 31.01.2019
comment
Был ли ваш интерфейс разработан с помощью IB или создан во время выполнения с использованием объектов и вызовов методов? Если это вручную, возможно, вы неправильно соблюдаете оконную модель.   -  person Jean-Baptiste Yunès    schedule 31.01.2019
comment
@ Jean-BaptisteYunès, извините, должен был упомянуть - это было сделано в InterfaceBuilder. Насколько я могу судить, он работает на Мохаве и более старых версиях High Sierra.   -  person Max Chuquimia    schedule 31.01.2019


Ответы (2)


У меня была такая же ошибка с простым приложением строки меню, созданным на macOS 10.14, но с ошибкой при работе в более ранних версиях ОС:

[NSMenu setItemArray:]: unrecognized selector sent to instance

При просмотре заголовочного файла для NSMenu я вижу:

/* Returns an array containing the receiver's menu items. 
   This property is settable in macOS 10.14 and later. */
open var items: [NSMenuItem]

Таким образом, вы не можете установить menu.items = someItemsArray, а можете использовать другой API (menu.addItem(item), menu.removeAllItems() и т. д.), чтобы решить проблему.

Похоже, что Apple упустила из виду в Xcode 10, не предупредив вас, что его нельзя установить в зависимости от цели развертывания вашего приложения.

https://openradar.appspot.com/45517851

person gdub    schedule 14.02.2019
comment
Знаете ли вы, есть ли штраф за дергание пользовательского интерфейса при одновременном добавлении многих пунктов меню? IE. Если каждый пункт меню должен быть .addItem() отдельно, вызывает ли он перерисовку или блокировку между каждым добавлением? Я бы предпочел установить их все сразу, если это возможно, чтобы избежать этого, но, возможно, я слишком много думаю об этом. - person William; 25.03.2019
comment
@William Нет, я не думаю, что это проблема, так как в любом случае до 10.14 вы всегда должны были это делать. - person gdub; 25.03.2019

ответ gdub был правильным в моем случае!

Обратите внимание, однако, что для меня проблема не была вызвана основным NSMenu окна (который действительно был установлен с помощью раскадровки), но у нас была всплывающая кнопка (NSPopupButton), которая также использует NSMenu внутри, и которую мы инициализировался с помощью items = [...], а не путем вызова addItem() в цикле. Это было просто неочевидно, потому что это было во внутреннем пользовательском NSView, поэтому мне потребовались часы, чтобы выкопать его.

Я согласен с тем, что основная проблема заключается в том, что Xcode не сообщает, что вам нужно, если @ available 10.14 для настройки элементов, но для обходного пути просто проверьте свой код, чтобы увидеть, установили ли вы NSMenu.items самостоятельно где-нибудь, и превратите его в цикл с помощью addItem . Вы упомянули, что у вас есть всплывающие кнопки (как и у нас), поэтому я надеюсь, что вы сможете исправить это, и ваше приложение снова заработает на 10.13.

person Sorin Dolha    schedule 11.06.2019