メソッドが複数のクラスを受け入れることを可能にするために多態性を使用するにはどうすればよいですか?
質問
私は受け入れる特定の方法を持っています UIView
オブジェクト、および2つのクラスのいずれかになることができるオブジェクトを渡したいと思います。だから、それは受け入れると言う UIView
それは動物を表し、私は渡すことができるようにしたい DogView
とa CatView
または潜在的に他の動物タイプのクラス。
そのメソッド内で私は設定したい nameLabel
すべての動物が持っているビュー。私はこれを行うことができるようにそれを設定するにはどうすればよいですか?
私の最初の反応は、スーパークラスを持つことでした(次のような AnimalView
)を持っている nameLabel
その上に変数を設定し、新しい動物ごとにサブクラス化します。しかし、私が望むなら nameLabel
アウトレットであるためには、ビューをIBに配線するためにすべてのサブクラスに変数を持つことができなかったため、設定可能ではないようです。
私はその後、試してみました Protocol
, 、しかし、それは多態性ではなく、一般的なスーパークラスを介してnameLabelプロパティにアクセスすることはできませんか?Objective-Cとは異なり、私はaを求めることができませんでした UIView <ProtocolName>
そして、それは私がそれを求めることを可能にするでしょう。
どのように私はこれを行う必要がありますか?私はちょうど別の種類のオブジェクトを渡すことができ、それがInterface Builderと互換性があるようにしたいと思っています。私はそれに完全に異なって近づくべきですか?
解決
のコンセントを接続することができます label
異なるに viewControllers
あなたのと SuperClass
ストーリーボードから あなたの別の場合 viewControlelrs
によるストーリーボードの再設定では、 Subclasses
(スーパークラスから派生した)ストーリーボードの名前。
1)定義するだけ
class SuperClass{
@IBOutlet weak var label: UILabel! = nil
}
SubClass1
レパセント view controller1
から派生したストーリーボードで SuperClass
SubClass2
別のものを再確認してください view controller2
から派生したストーリーボードで SuperClass
2)に行くよりも Assistant Editor
とオープン SuperClass
一方の側と他方の側 view controller1
からコンセントを接続し、 SuperClass
に label
ストーリーボードで view controller1
.からドラッグ SuperClass
label
でストーリーボードに view controller1
3)今再び開いています SuperClass
一方の側と他方の側 view controller2
からコンセントを接続し、 SuperClass
に label
ストーリーボードで view controller2
.からドラッグ SuperClass
label
でストーリーボードに view controller2
をクリックすると SuperClass
あなたは別のviewcontrollerにconneted二つのラベルが表示されますよりも出口
他のヒント
IBOutlet
superclass
に属するAnimalView
を宣言します。その後、Interface Builderで、Identity InspectorにカスタムUIView's
クラスをDogView
に設定したら、接続インスペクタとnameLabel
に移動します。
@interface Parent : UIView
@property (nonatomic,weak) IBOutlet UILabel *nameLabel;
@end
@interface Child : Parent
@end
.