25

複数のペン先で使用したいカスタムウィジェットを作成しています。そこで、新しいビューペン先Screen3を作成し、いくつかのボタンを追加して、UIAwesomeSauceウィジェットが必要になりました。

ビューを追加してからクラスIDを変更しただけでは、UIAwesomeSauceペン先からサブ要素を取得できません。ライブラリに移動してクラスに切り替えても同じです。UIViewControllerだけが「Loadfromnib」のフィールドを持っているようです。これは美しいでしょう。

コードからUIAwesomeSauceペン先をロードし、トップレベルのオブジェクトを取得して、手動で配置できることはわかっています。ただし、IBのポイントは、コードに物を配置する必要がないことです。UIAwesomeSauceをライブラリリスト自体に表示させることができれば、さらに良いでしょう。

解決済み-ニムロッドによる-説明とコードを読む

とにかく、それは素晴らしいことです。私は今、間抜けな素晴らしいもののために自分のウィジェットクラスを作ることができます。UIのFileOwnerをクラスに追加すると、通常のUIViewにすべてのものが含まれます。(ウィジェットのnib内の単一のビューをクラス自体にすることはできません。または、initWithCoderで再帰的になります。)次に、それを使用するnibで、バニラUIViewを作成し、そのクラスを変更します。その正方形の中にあるウィジェットを実際に見ることはできませんが、対処してください。

Selfは空白のビューになり、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;
}
4

2 に答える 2

14

nib の読み込みを指定できるのが UIViewController だけになると、あなたの痛みを感じますが、理由はわかりませんが、コントローラーであるファイルの所有者またはそのようなものが存在する必要があるためだと思います。 UIView をファイルの所有者にすることはできません。

カスタムオブジェクトの下のライブラリに物を置くことができると思いますが、UIViewのカスタムサブクラスに設定されたばかりのクラスでUIViewをそこに置くことに制限されると思います。私は実際にインターフェースビルダーを拡張しようと調べましたが、OS X のものではできるようですが、iPhone のものではできないようです。IB 内だけでウィジェットを描画する方法を伝えるために、インターフェイス ビルダーで新しいウィジェットのコードをコンパイルする必要があります。このための OS X テンプレートが実際にあると思います。

私がおそらく行うことは、すべてのサブビューを含むnibファイルにメインビューを作成し、次にinitWithCoderで作成することだと思います。UIAwesomeSauceでnibファイルを開き、メインビューをロードし、それをself内に配置してUIAwesomeSauceビューとサブビュー(場合によってはサブサブビュー)の間に「不要な」ビューがあります。それがどれほど非効率的かはわかりませんが、いくつかのものをいじると、UIWebViewのようないくつかのビューが持っているように見えますこれらの一見不必要な中間ビュー (IIRC) の 1 つです。

より良い解決策を思いついたら、私も知りたいので教えてください。

編集

今見てみると、UIView はファイルの所有者になることができると思います。IB で設定することはできません。基本的には、UIView サブクラスで nib ロードを次のように呼び出します。

[bundle loadNibNamed:@"UISpecialSauce" owner:self options:...]

UISpecialSauce などでアウトレットを作成した場合、所有者:自己のために正しく割り当てられるはずです。

于 2010-10-15T18:47:15.140 に答える