HorizontalModal の viewDidLoad メソッドに戻るボタンを描画するコードを配置すると、何も表示されません。しかし、HorizontalModal から継承するクラスの viewDidLoad メソッドに同じコードを入れると、ボタンが正常に表示されます。
次のように、サブクラス-viewDidLoad
がスーパークラスを呼び出していない-viewDidLoad
ようです。
- (void)viewDidLoad
{
[super viewDidLoad];
// subclass-specific view setup stuff here
}
これにより、スーパークラスのバージョンの が-viewDidLoad
最初に処理を実行し、次にサブクラスが実行する必要がある処理を実行できます。
スーパークラスからサブクラスのプロパティにアクセスできますか? それとも、これを行う別の方法がありますか (おそらくカテゴリを使用)?
すべてのサブクラスが提供することが期待される何らかのメソッドがスーパークラスに必要な場合は、そのメソッドをスーパークラスに入れ、サブクラスがそれをオーバーライドできるようにする必要があります。通常、メソッドのサブクラスの実装はスーパークラスのバージョンを呼び出しますが、それが必要な場合は、その事実を文書化する必要があります。
同じことがプロパティにも当てはまります。スーパークラスがサブクラスのプロパティ (例: backButton
) にアクセスする必要がある場合、スーパークラスはそのプロパティ自体を定義する必要があります。サブクラスは、プロパティの値を自由に変更したり、別のプロパティ アクセサーを提供したりできます。そのプロパティを使用するスーパークラスのコードは機能します。一般に、スーパークラスはそのサブクラスについて何も知る必要はありません。
MyModal
より具体的に言うと、 のサブクラスであるがあるとしましょうHorizontalModal
:
@interface HorizontalModal : UIViewController
@property(strong) UIView *backButton;
@end
@implementation HorizontalModal
- (void)viewDidLoad
{
self.backButton = [[BackButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];
[self.view addSubview:self.backButton];
}
@end
@interface MyModal : HorizontalModal
//...
@end
@implementation MyModal
- (void)viewDidLoad
{
[super viewDidLoad];
// more code specific to MyModal's view hierarchy
}
@end
の-viewDidLoad
メソッドは、プロパティの値を変更したり、アクセサーをオーバーライドしたりしても、プロパティHorizontalModal
にアクセスできるようになりました。は両方のバージョンの でまったく同じオブジェクトを指しているため、両方のバージョンが同じ情報にアクセスできることに注意してください。backButton
MyModal
self
-viewDidLoad