viewForRootVc
UIViewサブクラスの宣言されたプロパティであるUIViewがありますNewView
。初期化するのはNewView
の責任viewForRootVc
ですが、サブクラスNewViewSubClass
がその背景色を設定します。これがすべて完了すると、ルートビューコントローラはそのビューにサブビューとしてRootVc
追加します。viewForRootVc
しかし、これは機能しません。viewForRootVc
実際には追加されません。
ただし、次の3つのいずれかを実行すると機能します(ARCを使用していることに注意してください)。
viewForRootVc
の背景色を設定するのではなく、で設定NewViewSubClass
しNewView
ます。そして、のインスタンスを初期化するのではなく、NewViewSubClass
単に。のインスタンスを初期化しますNewView
。- で初期化するとき
viewForRootVc
はNewView
、直接割り当てを使用するのではなく、セッター(つまり、self.viewForRootVc)を呼び出します。 viewForRootVc
のヘッダーファイルにivarとしてリストしますNewView
。
なぜこれら3つが必要なのかわかりません。
動作しないコードは次のとおりです:RootVc.m
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NewView *newView = [[NewViewSubClass alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
//logs 0.00000, 0.00000
NSLog(@"%f, %f",newView.viewForRootVc.frame.size.width, newView.viewForRootVc.frame.size.height);
[self.view addSubview:newView.viewForRootVc];
//logs 0
NSLog(@"subviews: %i",[self.view.subviews count]);
}
NewView.h
@property (nonatomic, retain) UIView *viewForRootVc;
NewView.m
@synthesize viewForRootVc;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
viewForRootVc = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
}
return self;
}
NewViewSubClass.m
@synthesize viewForRootVc;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
viewForRootVc.backgroundColor = [UIColor greenColor];
}
return self;
}
私が気づいたことの1つは、ivarとして指定する場合、の実装ファイルviewForRootVc
を入れる必要がないことです。@synthesize viewForRootVc;
NewViewSubClass
私は常に、宣言されたプロパティが次のことを効果的に達成することを理解していました。
- 他のオブジェクトがそれらにアクセスできるようにします。
- 必要に応じてセッターが呼び出されるようにします。
retain
ARCを使用していない場合、プロパティ宣言で指定した場合、セッターを呼び出すとプロパティが自動的に保持されます。- ARCでは、宣言されたプロパティに対してivarが自動的に生成されます。
しかし、明らかにこれ以上のものがあります。それがスコープの問題なのか、それとも上記の機能しないコードが2つの異なるバージョンを作成することになったのかはわかりません。1つはのメソッドviewForRootVc
で指定された正しいフレームを持ち、もう1つは正しい背景色を持っています。のメソッドで指定されていますが、どちらにも正しいフレームと色の両方がありません。NewView
init
NewViewSubClass
init
誰かが宣言されたプロパティとivarsの意味を明確にし、セッターを呼び出して宣言されたプロパティを設定するか、値を直接割り当てることができることを強く望んでいます。