2016-11-28 3 views
0

Я написал пользовательскую кнопку, которая в основном представляет собой подкласс NSView. Кнопка реагирует на mouseDown() и должна запускать селектор/действие.Селектор в пользовательском классе

Я не знаю, как добавить целевую и переменную действия в подкласс (аналогично элементам пользовательского интерфейса, например NSButton). Я попробовал

Также как запустить селектор с целью в моем подклассе?

+2

Этот вопрос очень широк и, вероятно, является неправильным решением любой проблемы, которую вы пытаетесь решить. Если вы * должны * перевернуть свою собственную кнопку, возможно, лучше подкласс 'NSControl'. Лучше всего настроить 'NSButton' правильно. – par

+0

@par Нет ничего широкого в этом вопросе. OP имеет свойства цели и действия в пользовательском классе. Вопрос заключается в том, как вызвать действие на цель. – rmaddy

+0

@rmaddy, и все же ни один ответ на этот вопрос, кроме вас, не отвечает на вопрос OP. Винсент предлагает решение с использованием 'IBOutlet', и вы рекомендуете совершенно другой архитектурный подход с закрытием. Эти широкие ответы являются прямым результатом слишком широкого вопроса. – par

ответ

5

Пара «цель/действие» является архаичной и ее следует избегать. Но если вы действительно хотели его использовать, посмотрите на метод NSApplication sendAction(_:to:from:).

Или, если ваш заказ кнопка расширяет NSControl, вы можете использовать его target и action свойства и его метод sendAction(_:to:).

Более современный подход заключается в том, чтобы предоставить свойство закрытия для вашего класса кнопок, а затем вызвать это закрытие вместо использования пары цель/действие. Использование закрытия является более безопасным, чистым и, вероятно, упрощает запись кода клиента вашего класса кнопок.

+0

Что заставляет вас думать, что цель/действие архаичны? Этот шаблон поддерживает почти все элементы управления в iOS/OS X, а шаблон делегирования (цель/действие по существу является вариантом) по-прежнему является очень важным выбором API для многих целей. Разумеется, закрытие имеет свое место, но имеет свои недостатки (большинство людей по-прежнему очень смущены тем, когда использовать «слабое»), например. Ваш ответ, похоже, выступает за то, чтобы бросить проверенные принципы в пользу «последней вещи» без явных подтверждающих доказательств или мотивации. – par

+1

@par Нет цели безопасности в цели/действии. Нет простого способа поддерживать произвольные параметры для действия. Имейте в виду, что цель/действие в Cocoa была создана в Objective-C задолго до того, как были блоки. Это был единственный подход в то время. Затворы/блоки обеспечивают гораздо большую гибкость и безопасный тип. И в большинстве случаев он намного чище. – rmaddy

+1

@par И посмотрите на огромное количество вопросов «непризнанного селектора» при переполнении стека из-за проблем с неправильным использованием селекторов. – rmaddy

Смежные вопросы