2017-01-09 3 views
0

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

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

Во-первых, я создал 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)) 

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

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

enter image description here

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

Очевидно, что ошибка возникает на этой линии:

let view = top[0] as! NSView 

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

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

+0

При создании файла .xib, какой стиль XIb вы выбрали? –

+0

Что это значит? Я просто создал вид: Файл> Создать> Файл> Вид. – Cristian

+0

Когда я говорю Xcode для создания файла интерфейса, он дает мне варианты приложения, представления, пустого, раскадровки .... Я предполагаю, что тип приложения не тот, который вы хотите ... но это может быть то, что вы получили. –

ответ

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 
} 
Смежные вопросы