2017-12-19 15 views
0

normal,selected、およびdisabled州に異なる色のカスタムUIButtonサブクラスを作成しようとしています。私のボタンは、アプリケーションにインポートされたフレームワーク内に存在しますが、私がここに配置するすべてのコードスニペットで、私はメインアプリケーションとフレームワークの両方で試してみました。何の違いもないはずですが、私の基地。私は私の人生を救うために働くことができません。UIButtonで 'isSelected'または 'isEnabled'をオーバーライドすると、

class BrokenButton: UIButton { 
    override var isEnabled: Bool { 
     didSet { 
      print("This is never called no matter what I do") 
     } 
    } 
} 

私はセッターが機能しなかったため、上書きisEnabledの値を見るためにKVOを使用して試してみた:

class BrokenButton2: UIButton { 
    required init() { 
     super.init(frame: .zero) 
     addObserver(self, forKeyPath: #keyPath(isEnabled), options: [.new], context: nil) 
    } 

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) { 
     print("Never called") 
    } 
} 

私はここに私のウィットの終わりです。これについて何が間違っていますか?

+0

に答えるのstackoverflow。ストーリーボードまたはxibを使用している場合は、SubclassタイプをBrokenButtonに変更してください。 – suhit

+0

ボタンの状態を変更しようとしましたか?例えばisSelected put.isSelected =!button.isボタンアクション内でputSelectedを実行すると、didSetの開始が状態の変化を認識します。 – Mateusz

+0

KVOを使用する場合は、obj-cランタイムを使用しています。 'isEnabled'は' enabled'にする必要があります。 のprintButton.observe(\ BrokenButton2.enabled、options:[.new、.old、.initial]){(button、_)} } 'うまく動作しますあなたの 'didSet'プロパティ監視コードと同じように。 – beyowulf

答えて

1

@Daniel BrokenButtonクラスは、フレームワークの内部にあるとして、あなたは他のモジュールの外部からアクセスするためのオープンなキーワードを使用する必要があります。したがって、openキーワードをBrokenButtonクラスとisEnabledプロパティの前に追加するだけです。

open class BrokenButton: UIButton { 
    override open var isEnabled: Bool { 
     didSet { 
      print("This is never called no matter what I do") 
     } 
    } 
} 

オープンクラスが定義 モジュールの外部アクセス及びサブクラス化です。オープンクラスのメンバは、定義モジュールの の外部からアクセス可能でオーバーライド可能です。 open keyword..read thisに関する更なる情報のため

クラスBrokenButton前とオーバーライドプロパティISENABLEDのためのオープンなキーワードを使用してみてください

+0

私は戻って来て、これを回答として再投稿してくれてありがとう - 私は2日間私の髪を引っ張って、私はあなたが私を助けるための信用を持っていることを確認したかった! :) –

0

私は同じことを意味論と考えました。ここでは、それが動作する方法を再現するために取ることができるいくつかの手順があります。これらのステップのいずれかが間違っている可能性があります。

  1. UIButtonのサブクラスであるBrokenButtonクラスを作成します。上記の質問のように。

  2. は必ずクラスBrokenButton

    を作る作る、あなただけのストーリーボード/ XIBにドラッグ、および特定インスペクタにUIButtonを選択してストーリーボードまたはXIBを開き、ストーリーボードまたはXIB

  3. にUIButtonをドラッグあなたのIBOutletにボタンを接続し、ストーリーボード/ XIBで @IBOutlet weak var button: BrokenButton?

  4. 、接続インスペクタ:

  5. このようなあなたのViewController何かにアウトレットを作成します。それが作品にある。ここ button?.isEnabled = true

  6. は、その後、あなたのViewControllerに、このように有効または無効にするボタンを設定します。 enter image description here

+0

ボタンの他​​の動作が行われるため、これは正しくありません。 UIControlEvents 'touchDown'、 'touchUpInside'、 'touchUpOutside'、および 'touchCancel'のすべてについては、コンストラクター作業のステートメントを印刷し、オブザーバーは正常に動作します。このサンプルで行ったのと同じ方法で、私のクラスの 'isEnabled'をオーバーライドすると、printステートメントとdidSetのブレークポイントで、printステートメントもブレークポイントもヒットしません。 –

+0

ああ、私は参照してください。どのように "isEnabled"を設定していますか? –

+0

私は、自分の自己ではないです。このボタンは、設計ガイドラインに従っている私の会社のエンジニアが使用するためのものです。そのボタンは、パターン名で設定することができ、次に正しい色ですべての状態(正常、選択、無効)で自身を表します。 –

関連する問題