質問

私の特定のクラスのすべての子孫は、 UILabel インスタンス変数。だから私の親クラスで私は持っています var label: UILabel.私はサブクラスにもそれを持っていたいのですが、 IBOutlet.どのように私はこれを行うのですか?

私は追加しました IBOutlet 同じ名前の、および両方の変数宣言に弱い追加されました。しかし、「保存されたプロパティで上書きできません」というエラーが表示されます。

どのように私はこれを行う必要がありますか?そして、サブクラス化のためだけにスーパークラスのバージョンをインスタンス化する必要がないことは可能ですか?

役に立ちましたか?

解決

スーパークラスにIBOutlet修飾子を追加するだけです。

他のヒント

そうすることで、あなたは次のようになります re-declaring ザ- label サブクラス内のプロパティ。 IBOutlet インターフェイスビルダーで作業するための単なるコンパイラの概念です。

スウィフトで 保存されたプロパティ サブクラスでオーバーライドまたは再宣言することはできません。それらは継承することしかできません。

しかし、あなたは上書きすることができます gettersetter の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 からコンセントを接続し、 SuperClasslabel ストーリーボードで view controller1.からドラッグ SuperClass label でストーリーボードに view controller1

enter image description here

今再び開いています SuperClass 一方の側と他方の側 view controller2 からコンセントを接続し、 SuperClasslabel ストーリーボードで 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変数の宣言を削除します。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top