4

Interface Builderを使用してUIViewといくつかのサブビュー(UIWebView、UIToolbar、いくつかのUIBarButtonItems、進行状況インジケーターなど)を設計したいのですが、UIViewControllerを使用して、従来はこれを行う必要はないと思います。presentViewController:animated

そこで、 .h次のようなファイルコードを使用してカスタムクラスを作成しました。

@interface FileInteractionManager : NSObject {

}

@property (nonatomic, retain) IBOutlet UIView *fileView;
@property (nonatomic, retain) IBOutlet UIWebView *fileWebView;

@property (nonatomic, retain) IBOutlet UIBarButtonItem *printButton;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *optionsButton;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *doneButton;

私の.mファイルは次のとおりです。

@implementation FileInteractionManager

@synthesize fileView, fileWebView, doneButton, optionsButton, printButton;

-(id)init {

    NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"FileInteractionView" owner:self options:nil];

    NSLog(@"Load success!");

    return self;
}

最後に、「FileInteractionView.xib」という名前のスタンドアロンxibファイルを作成し、ファイルの所有者を上記で作成したカスタムクラスに変更して、IBOutletsを接続します。

クラスでメソッドを呼び出すとinit、デバッガーですべてのIBOutletオブジェクトが正しくインスタンス化されていることがわかります。

私の質問は次のとおりです。

  1. この方法はloadNibNamed:owner:options:、スタンドアロンの.xibファイルをロードする正しい方法ですか?このメソッドが私が使用しない配列を返すという事実は好きではありません(返されたトップレベルのオブジェクトは私の変数fileViewと一致しますが、私はすでにInterface Builderを介してそれらをリンクしています)。

  2. 私の一般的なアプローチは私の問題を解決するのに正しいですか?UIViewまったく新しいUIViewControllerを表示して閉じるのではなく、既存のUIViewControllerに追加できる単純なオブジェクトが必要だったため、上記の手順を実行しました。

4

2 に答える 2

6

私は少し異なるアプローチを使用します。UIViewのサブクラス(MyCustomView ie)を作成し、次にビューのUIを使用してxibを作成し、(メイン)ビュークラスを今定義したものに変更します。xibでは、アウトレットをカスタムビュー自体(ファイル所有者ではない)にリンクできます。最後に、クラス定義で次のような関数を作成します。

+ (id) newFromNib
{
    NSArray *nibArray = [[UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil] instantiateWithOwner:nil options:nil];
    return nibArray[0];
}

注意点:1)これはクラスメソッドです。「NSStringFromClass([selfclass])」のようなものにのみ「self」を使用できますが、実際のオブジェクトは返される変数です2)この例では、xibが同じであると想定していますクラスの名前(NSStringFromClass([self class]を介して)。何も変更せずにコピーして貼り付けることができます;))、ビューがxib(標準)で定義された最初のビューであること。1つのxib内に複数の「メイン」ビューを格納する場合は、適切な要素を選択してください。

MyCustomViewが必要な場合は、次のようにします。

MyCustomView* mycv = [MyCustomView newFromNib];

次に、フレーム/センターを設定してスーパービューに追加します...複雑なUI要素の「ライブラリ」があり、xibを介してそれらを設計し、必要に応じて追加する場合、この方法は非常に便利だと思います。

于 2013-03-25T11:33:39.000 に答える
1

il MalvagioDottorProsciuttoの答えはいいです。考えられる代替案は次のとおりです。

NS_DESIGNATED_INITIALIZERにペン先をロードし、サブビューの所有者になります

xibビュー自体ではなくサブビューのみを保持することを受け入れる場合は、サブビューをロードしinitWithFrame:て、所有権の構築をで保持できますxib

@interface MyCustomView ()
@property (strong, nonatomic) IBOutlet UIView *subview;
@end

@implementation MyCustomView
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
    [self addSubview:self.subview];
    return self;
}
@end
于 2016-03-16T12:25:43.227 に答える