2017-08-08 112 views
0

我有一个在顶部自定义视图区视图 - 控制,如下面的图片中看到enter image description here从笔尖添加自定义视图的viewController

我想自定义的厦门国际银行加载到这个领域,我努力做所以。 我创建了一个ABC.swift文件,它是NSView的一个子类和具有相同名称的.xib文件。 在身份检查器的.xib文件中,我设置了ABC类。 然后在我的ViewController的viewDidLoad()我尝试做以下

let abcView = Bundle.main.loadNibNamed("ABC", owner: self, topLevelObjects: nil) as ABC 

我也在我的VC 创建自定义视图的出口则在viewDidLoad()

customView.addSubview(abcView) 

但这不工作作为abcView是类型布尔。 谁能告诉我我做错了什么?什么是实现我的目标的最佳方式?

+0

Duplicate:https://stackoverflow.com/questions/27228362/os-x-addsubview-from-xib-in-swift?rq=1 –

+0

@ElTomato我不知道如何将其转换为swift 3语法。我也有点困惑之间的连接曾经与故事板。 'let abcView = Bundle.main.loadNibNamed(“ABC”,owner:self,topLevelObjects:nil)'returns bool。我如何将此添加到子视图? – sumesh

回答

0

在撰写本文时,macOS只有传统的捆绑加载方式:func loadNibNamed(_ nibName: NSNib.Name, owner: Any?, topLevelObjects: AutoreleasingUnsafeMutablePointer<NSArray?>?) -> Bool

它应您所提供的最后一个参数数组中通过笔尖的顶级对象:

var objs = NSArray() 
Bundle.main.loadNibNamed("MyScreen", owner: self, topLevelObjects: &objs) 

一定要检查它返回真。否则,这意味着它无法加载所需的笔尖。

加载后,界面生成器左侧菜单中的对象在您的代码中可用。如果你在你的笔尖视图,您可以将它作为一个子视图:

for obj in objs { 
    if obj is MyViewClass { 
    // Now we are sure that the obj is really a view of the desired class 
    self.someView.addSubview(obj) 
    } 
} 
+0

那么有没有更好的方法来做我想做的事情? – sumesh

+0

@sumesh,好吧,你可以对所有东西都使用相同的故事板,并尝试如下所示:https://developer.apple.com/documentation/appkit/nsstoryboard/1426549-instantiatecontroller –

0

我用下面的扩展上NSView:(同用户Accepted Answer给出答案)

import Foundation 
import Cocoa 

extension NSView { 

    static func loadFromNib(nibName: String, owner: Any?) -> NSView? { 

     var arrayWithObjects: NSArray? 

     let nibLoaded = Bundle.main.loadNibNamed(NSNib.Name(rawValue: nibName), owner: owner, topLevelObjects: &arrayWithObjects) 

     if nibLoaded { 
      guard let unwrappedObjectArray = arrayWithObjects else { return nil } 
      for object in unwrappedObjectArray { 
       if object is NSView { 
        return object as? NSView 
       } 
      } 
      return nil 
     } else { 
      return nil 
     } 
    } 
} 

这是如何使用它在loadView()NSViewController

if let loadedNavButtons: NavigationButtonsView = NSView.loadFromNib(nibName: "NavigationButtonsView", owner: self) as? NavigationButtonsView { 
    // Do whatever you want with loadedNavButtons 
} 

工程在斯威夫特4时,Xcode 9.2