カスタマイズしたUIScrollViewサブクラスをNibに正しくロードするにはどうすればよいですか?
-
08-07-2019 - |
質問
ペン先の中に素敵なUIScrollViewがありました。その後、非常に特別なニーズがあり、UIScrollViewをサブクラス化しました。ペン先で、IDインスペクターのクラスをサブクラスに変更しました。
しかし、何らかの理由で、nibローダーがnibからこれらすべてのオブジェクトを構築するときに、-initWithFrame:メソッドが呼び出されることはありません。実際、サブクラスでは現在何も変更していません。また、スクロールビューは正常に機能します。ペン先にテスト目的でSpecializedUIScrollViewであるべきだと言っても、空のUIScrollViewのように見えることを期待してください。
Nibファイルを使用してUIScrollViewをサブクラス化するときに考慮すべき点は他にありますか?
専用の初期化子は次のようになります:
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
NSLog(@"Hello !!!!!!!!!!!!!");
}
return self;
}
NibからHelloを読み込もうとすると、コンソールにHelloが表示されることはありません。もちろん、自分でそれを割り当てて初期化すると、動作します。しかし、スクロールビューをプログラムで配置することは望ましくありません。代わりに、そのクールなInterface Builderを代わりに使用できる場合は。
解決
nibまたはxibのオブジェクトはシリアル化されたオブジェクトとして保存されます。これは、initメソッドが呼び出されないため、 awakeFromNib
メソッドを使用する必要があることを意味する場合があります。
他のヒント
initWithCoder
を拡張し、必ずスーパーメソッドを呼び出してください。このスーパーコール中に、クラスで setFrame
が呼び出されます。
その後、 initWithCoder
で標準の initWithFrame
呼び出しを再利用できます。インターフェースビルダーが制御しますフレームサイズ。
- (id)initWithCoder:(NSCoder *)aDecoder {
[super initWithCoder:aDecoder]; // Required. setFrame will be called during this method.
return [self initWithFrame:[self frame]];
}