2017-08-08 116 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