混乱のポイントは、コードでUIオブジェクトを作成することと、InterfaceBuilder/ストーリーボードを使用してグラフィカルに作成することです。
1つの手がかりは、プリプロセッサヒント「IBOutlet」を使用することです。IBはInterfaceBuilder==グラフィック作成用です(ストーリーボードまたはxibファイルを使用)。
ストーリーボードで作成する場合...
完全に正しい構文は次のとおりですが、これまでと同じようにIBOutletプロパティを作成します。
@property (nonatomic, weak) IBOutlet UIView *main;
「カスタムビュー」ビューをオブジェクトライブラリからストーリーボードシーンにドラッグします。
- Ctrlキーを押しながらビューからviewControllerにドラッグします。接続するのに適したアイテムのリストが表示されます。IBOutletがリストに含まれている必要があります。それを選択します。
IBOutletの全体的な目的は、コードで使用できるストーリーボードシーンのアイテムへの参照を提供することです。
これを行う必要はありません:
[self.view addSubview : view];
すでに作成され、ストーリーボードに追加されているためです。ビュー階層で期待どおりに配置されていることを確認してください。
コードで作成する場合...
@interfaceでプロパティを宣言します
@property (nonatomic, strong) UIView *main;
(IBOutlet
ストーリーボードでリンクしていないため、必要ありません。ビュー階層にすぐに割り当てない場合は、「弱い」ではなく「強い」と宣言します)。
この行を追加する前に
[self.view addSubview : view];
考慮する必要があります:ストーリーボード/ xibに存在しない新しいビューを追加していますか?その場合、作成するまで追加できません。(ストーリーボードにあるビューをストーリーボードシーンに追加しても意味がありません)。
したがって、コードでこれを行っているように見えるので、ビューを追加する前にビューを作成する必要があります。
UIView* myView = [[UIView alloc] init];
ビュー階層に追加したときに表示される場所がわかるように、フレームプロパティを設定します
myView.frame = CGRectMake (CGFloat x, CGFloat y, CGFloat width, CGFloat height);
新しく作成したビューをプロパティに割り当てます
self.main = myView;
ビュー階層に追加します
[self.view addSubview : myView];
これで、self.mainを使用してコードで参照できます。これは、IB /ストーリーボードに追加し、IBOutletへの参照リンクをCRTLドラッグした場合とまったく同じです。
viewWithTag:
コードでビューを作成し、すぐにビュー階層に追加する場合、プロパティを宣言する代わりに、ビューに(数値)タグプロパティを設定することもできます。その場合、スーパービューのメソッドを使用してビューを参照できます。
できないことの1つは、コードでビューを作成し、ストーリーボードを使用してそれを操作することです。
これがすべてお役に立てば幸いです。さらに混乱するかもしれません。