1

Horizo​​ntalModal と呼ばれる UIViewController を拡張するクラスがあります。これは、とりわけ、それを拡張する各ビューに戻るボタンを自動的に生成したいと考えています。viewDidLoadHorizo​​ntalModal のメソッドに戻るボタンを描画するコードを入れると、何も表示されません。しかし、同じコードviewDidLoadを Horizo​​ntalModal から継承するクラスのメソッドに入れると、ボタンが正常に表示されます。

例えば:

self.backButton = [[BackButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];
[self.view addSubview:self.backButton];

明らかself.viewに、Horizo​​ntalModal とself.view子クラスで 2 つの異なるものを参照しています。そのメソッドを Horizo​​ntalModal クラスに保持し、戻るボタンを子クラス ビューに追加できる方法はありますか? IE、スーパークラスからサブクラスのプロパティにアクセスできますか? それとも、これを行う別の方法がありますか (おそらくカテゴリを使用)?

ありがとう

4

1 に答える 1

3

Horizo​​ntalModal の viewDidLoad メソッドに戻るボタンを描画するコードを配置すると、何も表示されません。しかし、Horizo​​ntalModal から継承するクラスの 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にアクセスできるようになりました。は両方のバージョンの でまったく同じオブジェクトを指しているため、両方のバージョンが同じ情報にアクセスできることに注意してください。backButtonMyModalself-viewDidLoad

于 2013-05-11T06:09:48.937 に答える