IBOutletで変数をサブクラス化するにはどうすればよいですか?
質問
私の特定のクラスのすべての子孫は、 UILabel
インスタンス変数。だから私の親クラスで私は持っています var label: UILabel
.私はサブクラスにもそれを持っていたいのですが、 IBOutlet
.どのように私はこれを行うのですか?
私は追加しました IBOutlet
同じ名前の、および両方の変数宣言に弱い追加されました。しかし、「保存されたプロパティで上書きできません」というエラーが表示されます。
どのように私はこれを行う必要がありますか?そして、サブクラス化のためだけにスーパークラスのバージョンをインスタンス化する必要がないことは可能ですか?
解決
スーパークラスにIBOutlet
修飾子を追加するだけです。
他のヒント
そうすることで、あなたは次のようになります re-declaring
ザ- label
サブクラス内のプロパティ。 IBOutlet
インターフェイスビルダーで作業するための単なるコンパイラの概念です。
スウィフトで 保存されたプロパティ サブクラスでオーバーライドまたは再宣言することはできません。それらは継承することしかできません。
しかし、あなたは上書きすることができます getter
と setter
のa properties
追加の検証または機能を提供するためのサブクラスで。Swiftガイドを参照してください: オーバーライド getter setter
あなたはスーパークラスであなたの財産を宣言する必要があります IBOutlet
.
または、サブクラスで別のプロパティを作成することもできます。また、サブクラスの1つでプロパティを接続していて(スーパークラスには他のものがあるかもしれません)、この実装をスーパークラスの他のサブクラスに
編集:また、設定することができます label
コンセントに二つの異なる viewControllers
あなたの SuperClass
あなたが与える場合は、ストーリーボードから Subclasses
異なるビューコントローラへのストーリーボード内の名前。
定義するだけです
class SuperClass{
@IBOutlet weak var label: UILabel! = nil
}
SubClass1
レパセント view controller1
から派生したストーリーボードで SuperClass
SubClass2
別のものを再確認してください view controller2
から派生したストーリーボードで SuperClass
に行くよりも Assistant Editor
とオープン SuperClass
一方の側と他方の側 view controller1
からコンセントを接続し、 SuperClass
に label
ストーリーボードで view controller1
.からドラッグ SuperClass
label
でストーリーボードに view controller1
今再び開いています SuperClass
一方の側と他方の側 view controller2
からコンセントを接続し、 SuperClass
に label
ストーリーボードで view controller2
.からドラッグ SuperClass
label
でストーリーボードに view controller2
をクリックすると SuperClass
あなたは別のviewcontrollerにconneted二つのラベルが表示されますよりも出口
は簡単な答えが単に単純にあると合意した:
"スーパークラスに
@IBOutlet
修飾子を追加するだけです。"
1つの注意:@IBOutlet
がフレームワークを介して定義されているViewControllerを(カルチャー付き)に照会する場合は、public
属性を変数定義に追加する必要があります。 edit:代わりに、open
Accessキーワードを使用します。
View Controller CustomViewController サブクラシをサブクラス化する uibilitiveviewController を持っているとしましょう。消費者アプリケーションにアクセス可能なものはすべてタグ付けされるべきです.public
:
public class CustomViewController: UIViewController {
override public func viewDidLoad() {
super.viewDidLoad()
}
@IBOutlet public var myBackgroundView: UIView!
@IBOutlet public weak var myLabel: UILabel!
.
このアプローチについての素晴らしいこと(そしてこのユースケースでは オンボードで、スーパークラスのInterface BuilderのIboutlet Mappingで実行することができることです。すべてのマッピングを保持しながら、サブクラスへのシーン。
e.g: subclassedCustomViewController
import UIKit
import mymodule
class SubclassedCustomViewController: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
myBackgroundView.backgroundColor = UIColor.blueColor()
myLabel.text = "My special subclass text"
}
. この質問は時に前に投稿されたことを認識していますが、私は同じ問題に苦しんでいて、ついに解決策を思いついたので、私はまだ私の調査結果を投稿するだろうと考えました...
問題を次のように理解しています(少なくともそれは私が解決したものです):
クラスBを継承する方法クラスBに継承し、各クラスは、一般的なIboutlet Propertiesを持つ独自のXIBファイルを持つものですか?サブクラスに共通のIBOUTLETSには、Interface Builderを使用してサブクラスのインターフェイスを設計することができます。*
そのために:
- スーパークラスのIboutlet接続を スーパークラス 'XIBファイル
- サブクラスのサブクラスのIBoutlet接続をサブクラスのXIBから作成します。 継承する必要があるもののスーパークラスと同じiBoutletプロパティ名を持つファイル。
- サブクラス 内のiBoutlet変数の宣言を削除します。