Загрузите несколько экземпляров NSView из Nib

Мне было интересно, существует ли метод для создания представления в xib-файле и последующего подключения его выходов к классу, чтобы вы могли создать несколько экземпляров этого класса и поместить их в окно. У меня есть некоторые проблемы, так что вы можете помочь мне исправить мой код?

Вот что я сделал:

Сначала я создал 2 файла: CustomView.xib и CustomView.swift. Затем я разработал интерфейс, добавив NSImageView к пользовательскому представлению. Я установил для владельца файла имя класса и добавил к нему выход из NSImageView.

Затем я создал следующую функцию для загрузки интерфейса из пера:

func loadView() -> NSView {
    var top = NSArray()
    Bundle.main.loadNibNamed("CustomView", owner: self, topLevelObjects: &top)
    let view = top[0] as! NSView
    return view
}

И установите класс для загрузки интерфейса:

override init(frame: CGRect) {
    super.init(frame: frame)
    let view = loadView()
    view.frame = bounds
    addSubview(view)
}

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

Поэтому я продолжил создавать две переменные этого класса и помещать их в окно:

var x = CustomView(frame: CGRect(x: 0, y: 0, width: 600, height: 105))
var y = CustomView(frame: CGRect(x: 0, y: 105, width: 600, height: 105))

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

Не удалось преобразовать значение типа "NSApplication" (0x7fffb5cf3ef0) в "NSView" (0x7fffb5d04bb0).

введите описание изображения здесь

Я думаю, что эта ошибка возникает потому, что иногда первый объект верхнего уровня - это представление, а иногда - окно. Так что я запутался.

Очевидно, ошибка выдается в этой строке:

let view = top[0] as! NSView

Так в чем здесь проблема?

(Пожалуйста, не отвечайте с сенсорным кодом какао)

1 ответ

Решение

Использовать filter функция, чтобы получить NSView пример

func loadView() -> NSView {
    var topLevelObjects = NSArray()
    Bundle.main.loadNibNamed("CustomView", owner: self, topLevelObjects: &topLevelObjects)
    let views = (topLevelObjects as Array).filter { $0 is NSView }        
    return views[0] as! NSView
}
Другие вопросы по тегам