インターフェイスビルダーでビューを取得して、別のペン先にカスタムビューをロードするにはどうすればよいですか?
-
08-10-2019 - |
質問
複数のペン先で使用したいカスタムウィジェットを作成しています。そこで、新しいビューNIB Screen3を作成し、いくつかのボタンを追加して、Uiawesomesauceウィジェットが必要になりました。
ビューを追加してからクラスのアイデンティティを変更するだけで、Uiawesomesauceネイブからサブエレメントを取得しません。ライブラリに行ってクラスに切り替える場合も同じです。 uiviewcontrollerのみが「load from nib」のフィールドを持っているようで、これは美しいでしょう。
Uiawesomesauceのペン先をコードからロードし、トップレベルのオブジェクトを取得し、手で置くことができることを知っています。しかし、IBのポイントは、コードに物を配置する必要がないことです。さらに良いことは、Uiawesomesauceをライブラリリスト自体に表示できるようにすることです。
解決済み - ニムロッド著 - 説明とコードを読んでください
とにかく、Dood、それは素晴らしいです。私は今、間抜けな素晴らしいもののために自分のウィジェットクラスを作ることができます。 UIのファイルオーナーをクラスに作成し、その中にはすべてのものを通常のUIViewを持っています。 (ウィジェットのペン先のシングルビューはクラス自体になることはできません。または、initwithCoderで再帰的になります。)次に、ペン先を使用したい場合は、バニラUiviewを作成してクラスを変更します。その正方形の中にウィジェットを実際に見ることはできませんが、取引します。
自己は今では空白のビューであり、TmyActualselfは、他のペン "で仕事をした単一のビューです。わーい!
- (id)initWithCoder:(NSCoder*)coder
{
if ((self = [super initWithCoder:coder]))
{
UIView *tMyActualSelf = nil;
// Initialization code
NSArray *tNibItems = [[NSBundle mainBundle] loadNibNamed:@"UIAwesomeSauce" owner:self options:nil];
for (id object in tNibItems)
{
if ([object isKindOfClass:[UIView class]])
tMyActualSelf = (UIView *)[object retain];
}
if( tMyActualSelf )
{
tMyActualSelf.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
[self addSubview:tMyActualSelf];
}
}
return self;
}
解決
UiviewControllerがあなたがペン先の負荷を指定できるのは唯一のものであることになるとあなたの痛みを感じますが、それはコントローラーであるファイルの所有者がいるか、そのようなものが必要だからだと思いますが、なぜ私は理由がわかりませんがuiviewはファイルの所有者になることはできません。
カスタムオブジェクトの下にライブラリに物を置くことができると思いますが、Uiviewのカスタムサブクラスに設定してクラスを使用してUiviewをそこに配置することに限定されると思います。私は実際にインターフェイスビルダーを拡張しようとしていることを検討しましたが、OS Xのスタッフのためにそれを行うことができるように見えますが、iPhoneのものではありません。インターフェイスビルダーの新しいウィジェットのコードをコンパイルして、IB内でウィジェットを描画する方法を伝えることが含まれます。実際にこれにはOS Xテンプレートがあると思います。
私がおそらくしていることは、すべてのサブビューを含むペンギーファイルにメインビューを作成することだと思います。次にinitWithCoder:uiawesomesauceのものでペン先ファイルを開き、メインビューを読み込み、自分の内側に置いて自分の内側に置いてください。 Uiawesomesauceビューとサブビュー(または場合によってはサブサブビュー)の間に「不必要な」ビューがあります。これらの一見邪悪な中間ビューの1つ(IIRC)。
あなたがより良い解決策を思いついたなら、私も知りたいので教えてください。
編集
私がそれを見ているので、Uiviewはファイルの所有者になることができると思います。IBでセットアップできません。基本的に、あなたはuiviewサブクラスでこのようなものをニブロードすると呼びます:
bundle loadnibnamed:@"uispecialsauce"所有者:自己オプション:...
UispecialSauceなどでアウトレットを作成した場合、所有者のために正しく割り当てられるべきだと思います:self。
他のヒント
実際にそれを助けるかもしれないココアポッドがあります:https://github.com/mobilejazz/nibwrapper
これは、別のペン先から子どものビューをロードするラッパービューを提供します。ランタイム属性を介して、そのペンイン挿入インターフェイスビルダーの名前を指定できます。