Создайте пользовательское действие в классе для использования в Interface Builder

Я хочу создать соединение с пользовательским действием в классе, которое должно быть видно в Interface Builder. Например, я добавляю свойства действия/цели в класс NSView вот так:

weak open var object: AnyObject?    
open var something: Selector?

Действие something, цель object. Теперь я хочу, чтобы в Interface Builder была доступна ссылка/соединение «Отправить действие» для something и чтобы иметь возможность подключиться к методу @IBAction к некоторому классу (например, контроллеру представления), точно так же, как это можно сделать для простой NSButton. Может быть, это невозможно, или, может быть, я должен добавить некоторые ключевые слова перед парой пользовательское действие/цель, так же, как нам нужно, чтобы свойство @IBInspectable отображалось в инспекторе атрибутов.

Любая помощь приветствуется ;-)


person Ivaylo Nikolov    schedule 21.12.2018    source источник
comment
вы можете добавить жест к своему представлению в раскадровке, а затем подключить этот жест к вашему @IBAction   -  person canister_exister    schedule 21.12.2018
comment
Создать подкласс NSControl вместо NSView?   -  person Willeke    schedule 22.12.2018
comment
@Willeke Спасибо за ваш комментарий. То, что вы предлагаете, является базовой функциональностью IB, и на самом деле не имеет значения, какой класс я буду использовать, если он основан на NSControl. То же самое и с NSButton. Проблема в том, что я не хочу использовать NSControl и прошу решение, которое можно использовать с любым классом. Спасибо за помощь - должен сказать, что ваш комментарий наиболее близок к ответу, который я ищу ;-) В любом случае, я считаю, что функциональность, которую я ищу, еще недоступна, но дам сообщению немного больше времени. - никогда не знаешь ;-)   -  person Ivaylo Nikolov    schedule 28.12.2018


Ответы (2)


Я не думаю, что вы можете сделать это. Вы можете добавить свойства @IBInspectable в пользовательские подклассы NSView, но для свойств нет селектора или типа данных действия. Допустимы только следующие типы: Boolean, Number, String, Localized String, Point, Size, Rect, Range, Color, Image, Nil.

Interface Builder имеет встроенную поддержку для обработки свойств целевого действия элементов управления.

(Кстати, вам, вероятно, следует добавить тег Mac OS в свой вопрос. Большая часть трафика Apple на этой доске связана с iOS.

РЕДАКТИРОВАТЬ:

Как кто-то сказал в комментарии, если вы создаете объект, у которого есть цель/действие, он, вероятно, должен быть NSControl, а не NSView. Элементы управления — это семейство объектов, которые обрабатывают целевые действия, и в Интерфейсном Разработчике ЕСТЬ механизм для добавления цели/действий к элементам управления.

person Duncan C    schedule 21.12.2018
comment
Я добавил тег macOS, но вопрос не зависит от ОС. - person Ivaylo Nikolov; 22.12.2018
comment
Вы спрашиваете о NSButton, характерном для Mac OS. Существует эквивалент UIButton для iOS и TVOS, но NSButton уникален для Mac OS. - person Duncan C; 22.12.2018
comment
Создание соединения target/action в Interface Builder одинаково для macOS, tvOS и iOS. Просто не имеет значения, какая ОС. Вы всегда перетаскиваете и создаете соединение для действия или выхода. И если есть способ создать настраиваемое соединение таким же образом, как мы можем добавлять свойства через @IBInspectable, оно снова будет одинаковым для всех ОС — точно так же, как реализация @IBInspectable одинакова для всех ОС. В любом случае спасибо за комментарий... - person Ivaylo Nikolov; 26.12.2018
comment
Я хорошо знаю, что интерфейсный конструктор работает одинаково для iOS и Mac OS. (Я занимаюсь разработкой для Mac с 1980-х годов.) Проблема, с которой вы столкнетесь при попытке создать собственный IBAction, заключается в том, что Interface Builder позволяет проверять только очень небольшой список типов данных, а IBAction не входит в число поддерживаемых. типы. - person Duncan C; 26.12.2018
comment
Да вы правы. Я подозревал об этом, но все же решил спросить. Я надеялся, что кто-то с большим опытом (например, вы) поможет мне с некоторыми идеями, как реализовать эту или аналогичную функциональность. Теперь вопрос с правильным тегом, хотя '... - person Ivaylo Nikolov; 26.12.2018
comment
(Я пытался, и здесь на SO есть тег IBInspectable. Я добавил его к вашему вопросу.) Также см. Редактирование моего ответа. - person Duncan C; 26.12.2018
comment
Спасибо за предложение, но это не то, что я ищу. - person Ivaylo Nikolov; 28.12.2018

В iOS есть один довольно банальный вариант — у вас может быть выход к UIBarButtonItem, а затем кто-то может добавить автономный UIBarButtonItem в свой xib или раскадровку. Затем UIBarButtonItem может иметь цель/действие, и ваш класс может затем извлечь цель/действие оттуда в awakeFromNib и присвоить значения вашему собственному классу. Этот подход можно воспроизвести в MacOS с помощью NSToolbarItem, но я не пробовал. На самом деле это неуклюжий вариант, так как он требует дополнительных объектов xib и может быть не слишком очевидным, что происходит, но он может работать. По сути, UIBarButtonItem/NSToolbarItem будет действовать только как контейнер для значений цели/действия.

Если вы не можете создать подкласс NSControl, может показаться, что предпочтительным вариантом является наличие делегата. Обычно это нормально, если только один контроллер не должен быть делегатом для нескольких экземпляров вашего класса, и в этом случае методы делегата становятся более утомительными. Другим вариантом является наличие у вашего класса свойства блока, которое выполняется при действии, но блоки должны назначаться в коде, а не устанавливаться в Interface Builder.

person Carl Lindberg    schedule 09.06.2021