Что эквивалентно загрузкеNibNamed в Swift

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

[[[NSBundle mainBundle] loadNibNamed:@"Games-New" owner:nil  
options:nil] firstObject]; 

Спасибо.

Ответы

Ответ 1

NSBundle.mainBundle().loadNibNamed("Games-New", owner: nil, options: nil)[0]

Ответ 2

Возможно, API изменился. Третий параметр loadNibNamed больше не options, он topLevelObjects. Для меня работает следующий код:

var objects: NSArray?
NSBundle.mainBundle().loadNibNamed("MyView", owner: self, topLevelObjects: &objects)

Ответ 3

Вот расширение UIView

public extension UIView {

    public class func instantiateFromNib<T: UIView>(viewType: T.Type) -> T {
        return NSBundle.mainBundle().loadNibNamed(String(describing: viewType), owner: nil, options: nil)?.first as! T
    }

    public class func instantiateFromNib() -> Self {
        return instantiateFromNib(self)
    }

}

Использование

let awesomeView = AwesomeView.instantiateFromNib()

ИЛИ

let awesomeView = UIView.instantiateFromNib(AwesomeView.self)

Ответ 4

Swift 3


Имя
Имя файла nib, который не должен содержать расширение .nib.

владелец
Объект для назначения в качестве объекта File Owner Owner.

параметры
Словарь, содержащий параметры, используемые при открытии файла nib.

первый
если вы не определяете сначала, а затем хватаете все представление.. поэтому вам нужно захватить один вид внутри этого набора frist.

Bundle.main.loadNibNamed("yourUIView", owner: self, options: nil)?.first as! yourUIView

Ответ 5

Используйте это для загрузки вашего ножа.

let myView = NSBundle.mainBundle().loadNibNamed("MyView", owner: nil, options: nil)[0] as UIView

Затем вы можете добавить его в свой вид, как обычно.

view.addSubview(myView)

Ответ 6

Для Swift 3:

Bundle.main.loadNibNamed("Games-New", owner: nil, options: nil)?[0]

FYI: NS (не полностью) удалено в Swift 3

Ответ 7

В документах это похоже на то, что оно отличается от macOS и IOS.

Для macOS и Swift 4 для меня работало следующее:

func loadFromNib(_ nibName: String) -> NSView? {
    var topLevelObjects: NSArray?
    if Bundle.main.loadNibNamed(NSNib.Name(rawValue: nibName), owner: self, topLevelObjects: &topLevelObjects) {
        return topLevelObjects?.first(where: { $0 is NSView } ) as? NSView
    } else {
        return nil
    }
}

Ответ 8

в Swift 4, NSBundle.mainBundle изменен на Bundle.main.loadNibNamed

Bundle.main.loadNibNamed("MyDenizbankLoading", owner: nil, options: nil)![0]

Ответ 9

Это как сделать в macOS в Swift 4

Регистрация

collectionView.register(NSNib(nibNamed: NSNib.Name(rawValue: "Cell"), bundle: nil)!,
                            forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "Cell"))

Dequeue

func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {

  let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "Cell"), for: indexPath)
  guard let cell = item as? Cell else { return item }

  let value = values[(indexPath as NSIndexPath).item]
  cell.imageView?.setImage(url: value, placeholder: Image(named: NSImage.Name(rawValue: "placeholder")))

  return cell
 }

Ответ 10

Это сработало для меня

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {

    var objects: NSArray?
    Bundle.main.loadNibNamed("CellView", owner: self, topLevelObjects: &objects)

    var newView = NSView()
    for object in objects ?? [] {
        if (object is NSView) {
            newView = object as! NSView
            break;
        }
    }

    var cellView: CellView?
    for view in newView.subviews {
        print("class: \(view.className) ")
        if (view is CellView) {
            cellView = view as? CellView
            break;
        }
    }

    cellView?.imageView.image = image
    cellView?.textFieldView.stringValue = text

    return cellView
}