#ios #swift #inner-classes #ibdesignable
Вопрос:
Я разрабатываю графическую библиотеку в Swift. Код не может быть передан, но я сделал образец здесь (см. Пример кнопки, переключатели были посвящены другому вопросу).
Я хотел бы иметь пространство MyGraphicLibrary
имен для своих компонентов: MyGraphicLibrary.Button
вместо MyGraphicLibraryButton
Модуль с образцами состоит из двух классов:
// Independent class
@IBDesignable public class CustomButton: UIButton {
...
}
// Namespace for my components
public class MyGraphicLibrary: NSObject {
}
// Namespaced button
public extension MyGraphicLibrary {
@objc(MyGraphicLibraryButton) @IBDesignable class Button: UIButton {
...
}
}
CustomButton
Класс ведет себя так, как ожидалось в конструкторе интерфейса: я могу легко добавить пользовательский класс к кнопке (см. Main.storyboard
).
Для вложенного класса невозможно задать его обычное имя ( Button
или MyGraphicLibrary.Button
).
Единственный способ-установить имя класса @objc MyGraphicLibraryButton
; автозаполнения нет, и для модуля должно быть установлено значение none
(что выглядит как ерунда, класс принадлежит модулю GraphicLibrary). Удаление имени @objc не имеет никакого значения.
Есть ли способ заставить вложенный класс правильно обрабатываться построителем интерфейса?
Ответ №1:
Я думаю, что в целом ответ на ваш вопрос «Нет», вы не можете использовать классы Objective-C так, как вы пытаетесь.
Конструктор интерфейсов ищет имя класса Objective-C в своем интерфейсе. Objective-C представляет собой плоское пространство для имен классов. Нет понятия вложенного пространства имен (именно поэтому вы получаете префиксы имен, такие как «NS»).
Вы пытаетесь навязать структуру пространства имен, используя функции Swift, но эта структура не имеет никакого значения для Objective-C. Даже если вы объявите класс Objective-C во вложенном контексте Swift, он все равно будет существовать в плоском пространстве классов Objective-C.
И конструктор интерфейсов собирается извлечь имя из этого плоского пространства.
Комментарии:
1. Я понимаю, что именно в этом и заключается цель имени objc с префиксом. Но почему у меня не может быть этого класса в выпадающем списке? И почему я могу добавить класс только с «модулем», установленным в «нет» ?
2. В основном потому, что то, что вы делаете, необычно и кажется сбивающим с толку разработчиком интерфейса. Если вы хотите, чтобы такое поведение поддерживалось, я бы связался с Apple через их механизм обратной связи и описал, как бы вы предпочли такое поведение.