NSCollectionView, Swift 4 – невозможно вызвать регистрацию

Может ли кто-нибудь предложить, как решить эту проблему NSCollectionView? Конвертировался из Swift 3 в Swift 4, и началось волшебство :)

Код:

let item = NSNib(nibNamed: NSNib.Name(rawValue: "MACollectionViewItem"), bundle: nil)
collectionView.register(item, forItemWithIdentifier: "CollectionViewItem")

Ошибка во второй строке:

Не удается вызвать «register» со списком аргументов типа '(NSNib?, forItemWithIdentifier: String)'


person spacecash21    schedule 26.09.2017    source источник


Ответы (1)


В Swift 4 вам нужно использовать NSUserInterfaceItemIdentifier вместо String для идентификации элемента пользовательского интерфейса.

Вы должны определить статические константы для идентификаторов и ссылаться на них при регистрации пера.

Пример:

extension NSUserInterfaceItemIdentifier {
    static let collectionViewItem = NSUserInterfaceItemIdentifier("CollectionViewItem")
}

collectionView.register(item, forItemWithIdentifier: .collectionViewItem)
person Tamás Sengel    schedule 26.09.2017
comment
Вы также можете определить статические константы для идентификаторов. Насколько я понимаю, это рекомендуемая схема. - person Martin R; 26.09.2017
comment
Я хочу сказать, что теперь вы можете определить свойство статического типа NSUserInterfaceItemIdentifier вместо константы String. - person Martin R; 26.09.2017
comment
Спасибо за такой быстрый ответ! Люблю Swift после Objective C, Swift 3 был действительно хорош, но похоже Swift 4 не становится легче :) - person spacecash21; 26.09.2017
comment
@spacecash21: Вы заметили, что уже используете ту же технику в своем NSNib(nibNamed: NSNib.Name(rawValue:...)) ? - person Martin R; 26.09.2017
comment
Да, видел :) Изменения неизбежны, трудно приспособиться :D Привыкну через неделю-две :) - person spacecash21; 26.09.2017
comment
Этот ответ не работает с любой версией Swift в Xcode 10. Я получаю сообщение об ошибке компилятора: метки аргументов '(_ :)' не соответствуют доступным перегрузкам - person Bryan; 29.10.2018
comment
@Bryan Только что проверил, это все еще работает со Swift 4.2. Я бы посоветовал еще раз проверить синтаксис. - person Tamás Sengel; 29.10.2018
comment
Спасибо Тамас. Версия Swift проекта была неправильно изменена на 3, что и вызвало этот сбой. В 4.2 действительно работает - person Bryan; 30.10.2018