Ответ 1
NSBundle.mainBundle().loadNibNamed("Games-New", owner: nil, options: nil)[0]
Я конвертирую свой код Objective-C в Swift и задавался вопросом, что является быстрым эквивалентом этого кода.
[[[NSBundle mainBundle] loadNibNamed:@"Games-New" owner:nil
options:nil] firstObject];
Спасибо.
NSBundle.mainBundle().loadNibNamed("Games-New", owner: nil, options: nil)[0]
Возможно, API изменился. Третий параметр loadNibNamed
больше не options
, он topLevelObjects
. Для меня работает следующий код:
var objects: NSArray?
NSBundle.mainBundle().loadNibNamed("MyView", owner: self, topLevelObjects: &objects)
Вот расширение 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)
Swift 3
владелец
Объект для назначения в качестве объекта File Owner Owner.
параметры
Словарь, содержащий параметры, используемые при открытии файла nib.
первый
если вы не определяете сначала, а затем хватаете все представление.. поэтому вам нужно захватить один вид внутри этого набора frist
.
Bundle.main.loadNibNamed("yourUIView", owner: self, options: nil)?.first as! yourUIView
Используйте это для загрузки вашего ножа.
let myView = NSBundle.mainBundle().loadNibNamed("MyView", owner: nil, options: nil)[0] as UIView
Затем вы можете добавить его в свой вид, как обычно.
view.addSubview(myView)
Для Swift 3:
Bundle.main.loadNibNamed("Games-New", owner: nil, options: nil)?[0]
FYI: NS (не полностью) удалено в Swift 3
В документах это похоже на то, что оно отличается от 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
}
}
в Swift 4, NSBundle.mainBundle изменен на Bundle.main.loadNibNamed
Bundle.main.loadNibNamed("MyDenizbankLoading", owner: nil, options: nil)![0]
Это как сделать в 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
}
Это сработало для меня
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
}