Загрузите несколько экземпляров 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
}