2017-08-08 13 views
0

をViewControllerをするためにペン先からカスタムビューを追加しますそう。 NSViewのサブクラスであるファイルABC.swiftと、同じ名前の.xibファイルを作成しました。 アイデンティティ・インスペクタの.xibファイルで、クラスABCを設定しました。 はその後、私のViewControllerのviewDidLoad()に私はまたviewDidLoad()は、下の画像に見られるように、私は、このエリアにカスタムXIBをロードしたいと私はやって苦労しています<a href="https://i.stack.imgur.com/DQfCG.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/DQfCG.png" alt="enter image description here"></a></p> <p>、上部のカスタムビューエリアでのViewControllerを持って

customView.addSubview(abcView) 

で、その後、私のVC でカスタムビューのための出口を作成した。しかし、これはabcViewがであるように動作していない以下の

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

をしようBoolと入力します。 誰かが私に間違っていることを教えてもらえますか?私の目標を達成する最良の方法は何ですか?

+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)'は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) 

は、それが真を返し確認してください。それ以外の場合は、希望のペン先をロードできなかったことを意味します。

ロードされた後、Interface Builderの左側のメニューにあるオブジェクトがコード内で使用可能になります。あなたのペン先での表示がある場合は、サブビューとして追加することができます。

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

@スメッシュ、そうですね、同じストーリーボードをすべて使用して、次のようなことを試すことができます: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 
     } 
    } 
} 

これは、 NSViewControllerloadView()でそれを使用する方法:

if let loadedNavButtons: NavigationButtonsView = NSView.loadFromNib(nibName: "NavigationButtonsView", owner: self) as? NavigationButtonsView { 
    // Do whatever you want with loadedNavButtons 
} 
スウィフト4で

作品、XCodeの9.2