РЕШЕНИЕ
let parentViewControllerInstance = self.parent as! ParentViewController
segmentedControl.target = parentViewControllerInstance
В моем случае мне просто нужно было установить делегата как цель метода sendAction
.
Фон
Хорошо, после нескольких часов чтения документации AppKit я теперь могу ответить на свой вопрос.
Во-первых, отладка пользовательского интерфейса показала, что проблема определенно не в ViewHierarchy.
Поэтому я попытался подумать о природе NSButton и NSSegmentedControl. В какой-то момент я заметил, что оба являются подклассами NSControl.
class NSSegmentedControl : NSControl
class NSButton : NSControl
Документация AppKit гласит:
Обсуждение
Кнопки - это стандартный элемент управления, используемый для запуска действий в вашем приложении. Вы можете настроить кнопки со многими различными визуальными стилями, но их поведение одинаково. При нажатии кнопка вызывает метод действия связанного с ней целевого объекта . (...) Вы используете метод действия для выполнения задач, специфичных для вашего приложения.
Жирный текст указывает на ключ решения - связанного с ним целевого объекта . Обычно я определяю действие элемента управления следующим образом:
button.action = #selector(someFunc(_:))
Это заставляет экземпляр NSControl вызывать это:
func sendAction(_ action: Selector?, to target: Any?) -> Bool
Описание параметров из документации:
Параметры
theAction
Селектор для вызова на цель. Если селектор равен NULL, сообщение не отправляется.
theTarget
Целевой объект для получает сообщение . Если объект равен nil, приложение ищет в цепочке респондента объект, способный обработать сообщение . Для получения дополнительной информации о диспетчерских действиях см. Описание класса для NSActionCell.
В заключение у экземпляра NSControl, который запускал метод действия (в моем случае NSSegmentedControl), не было цели для отправки своего действия. Таким образом, он мог только отправить свой метод действия через цепочку респондента - который, очевидно, был нулевым, пока первый респондент находился в другом представлении.