2017-10-23 1 views
0

NSStackViewのサブクラスを作成しようとしました。たとえばNSStackViewに特殊な色を付けるなどです。NSStackViewのサブクラスを作成する

これをインスタンス化するには、わかっていればinitと呼ばれるスーパークラスを呼び出す必要があります。

NSStackViewの指定されたイニシャライザはどのように検出できますか。 https://developer.apple.com/documentation/appkit/nsstackviewを見て、私が見つける唯一のイニシャライザがある:

init(views: [NSView]) 

が、次のコードは、「スーパークラスの指定イニシャライザを呼び出す必要があります 『NSStackView』」

class CStackView: NSStackView 
{ init(views: [NSView], withColor color: NSColor) 
    { super.init(views: views) 
    // do something wich the color 
    } 

    required init?(coder decoder: NSCoder) 
    { fatalError("init(coder:) has not been implemented") 
    } 
} 

のinit(コーダでコンパイルされません。 )は、指定された初期化子のようですが、私はCStackViewをそのサブビューで、コーダーを持たずに初期化したいと思っています。

答えて

2

init(views:)は便利な初期設定です。その後、

NSStackViewは、任意の指定された初期化子を宣言していない、それはinit(frame:)init(coder:)

があり、そのスーパークラス、NSView、からそれらを継承するので、あなたの初期化コールsuper.init(frame:)を持っているか、利便初期化子として、あなたの初期化子を宣言することができますどちらかとそれはself.init(views:)と呼ぶことができます。

+0

私は自分の利便初期化子を記述する場合、私はその後、(フレーム:)またはでsuper.init(コーダ:)でsuper.initを呼び出す必要があり、自分のクラスの指定イニシャライザを呼び出す必要があります。 NSStackViewsのinit(views :)を呼び出すチャンスは決してありません。あれは正しいですか? – mik

+0

どこから知っていますか?init(views :)は便利な初期化子です(コンパイラのエラーを除く)。 – mik

+1

独自の便利な初期化子を書くと、サブクラスが自分自身で指定された初期化子を宣言していない限り、 'self。{superclass convenience initializer} 'を呼び出すことができます。 – dan

0

@ダンの助けを借りれば、それはそれです。

class C3StackView: NSStackView 
{ convenience init(views: [NSView], withColor color: NSColor) 
    { self.init(views: views) 
    // do something wich the color 
    } 

    required convenience init?(coder decoder: NSCoder) 
    { fatalError("init(coder:) has not been implemented") 
    } 
} 
関連する問題