Как указать вложенный пользовательский класс представления?

Доступные вложенные классы SuperView и NestedView.

class SuperView : UIImageView {

    class NestedView : UIImageView {
        var text : String = "Nested View"
    }

    var text : String = "Super View"
    var nested : NestedView?

}

Я хотел бы установить для UIImageView свойство с именем "Custom Class Name" для значения "NestedView" внутри инспектора сцены раскадровки. Но Interface Builder не смог найти класс "NestedView".

enter image description here

Ответы

Ответ 1

В это время я думаю, что Interface Builder распознает имена классов Objective-C. Вы все равно можете заставить Interface Builder найти вложенный класс с ключевым словом @objc:

class SuperView: UIView {
  @objc(SVNestedView) class NestedView: UIImageView {
  }
}

Затем в Interface Builder укажите, что th-представление имеет класс SVNestedView. Поскольку Objective-C не помещается в пространство имен, вам все равно нужно выбирать уникальные имена для каждого вложенного класса, но по крайней мере сторона Swift должным образом помещается в имена.

Ответ 2

В Swift экземпляр внутреннего класса не зависит от любого экземпляра внешнего класса. Это похоже на то, что все внутренние классы в Swift объявляются с использованием Java static.

Я не думаю, что этот классный дизайн соответствует вашим требованиям. Что вам нужно сделать, вам нужно создать новый класс вне вашего представления и создать какую-то композицию. Это наверняка поможет вам.

Вот некоторые изменения вашего кода:

class SuperView : UIImageView {
    var text : String = "Super View"
    var nested : NestedView = NestedView()
}

class NestedView : UIImageView {
    var text : String = "Nested View"
}

Ответ 3

Я думаю, что пока невозможно определить внутренний класс в раскадровке, подобной SuperView.NestedView. Поэтому я делаю класс расширенным из внутреннего класса, а затем указываю его в раскадровке, например, SuperView_NestedView. Меня устраивает.

final class SuperView_NestedView: SuperView.NestedView {} // Specifies this class in the storyboard 
class SuperView : UIImageView {

    class NestedView : UIImageView {
        var text : String = "Nested View"
    }

    var text : String = "Super View"
    var nested : NestedView?

}

Это представление можно назвать SuperView.NestedView из ViewController, поскольку SuperView_NestedView расширено от SuperView.NestedView.

class TheViewController: UIViewController {
    @IBOutlet var nestedView: SuperView.NestedView!