2011-02-23 8 views
16

私は特定のボタン(ラベルやimageViewなど)を使用してIBをデザインしています。別のxib内でのxibオブジェクトの使用

私はそのボタンの6つのオブジェクトを持っている別のxibのxibオブジェクト(ボタン)を使用したいと思います。

私は、クラス識別子を使用してプログラムで行うことができますが、私は私のlablesと画像ビューを配置し、デフォルト値とその他すべてをコードに設定しなければなりません。

IBだけで同じことをすることができるのだろうか? (もちろん、私はまだコードの値を設定するだろうが、私はlables/ImageViewのとXIBに設定するすべての残りの位置にしたい)

おかげ

編集

ので、私が最初に求めたことは理解できません。 私は今のようにしようとしています:

私はButtonTest.xibを作成しました。 Xibの中に私はUIViewと3つのサブビュー(2つのlablesとボタン)を持っています。 インスペクタでは、UIViewクラスをButtonTestに設定しました。 ButtonTest.mの中に私はIBで接続するサブビューのそれぞれに3つのアウトレットがあります。

次はButtonTestViewController.xibです。 私は1つのビューを入れて、インスペクタのクラスをButtonTestに設定しました。 私はクラスのButtonTestViewController.mButtonTest

内部myTextViewコンセントにそのビューを接続し、これはButtonTestViewController.mのviewDidLoad内のコードです:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"ButtonTest" owner:nil options:nil]; 
    ButtonTest *mainView = (ButtonTest*)[subviewArray objectAtIndex:0]; 

    self.myTextView = mainView; 
} 

私が起こることを望んだ何を、ButtonTestViewControllerのビューということです。 xibはButtonTest.xibで設計したビューになります。 これはあまり起こっていません。 ButtonTestViewController.xib内のビューは同じままです。

[self.view addSubview:mainView]; 

それは既存のもののほかに、新しいビューを追加します:

言及する価値

は、私が追加した場合ということです。

私は何をしたいのですか?

最終的にButtonTestViewController.xibに6つのビューを持ちたいと思います。すべてButtonTest.xibテンプレートのようになり、lables値はコードで設定されます。

EDIT2

[OK]を、みんなは私はあなたが言った、それが魅力のように働いたすべてをしました。 私が今問題を抱えている唯一の問題は、ButtonTestViewController.xibのビューがもう少し大きく、ButtonTest.xibのビューである場合です。 これが起こると、ボタンのlableは非常にぼやけて見えます。 両方が同じサイズであれば、すべてうまくいきます。ネッド@

- 私はこれまで、フレーム文を切り替え除いて、あなたは私のInitWithCoder方法に投稿された正確なコードを使用:、私はそれを修正しようとしているIBにおけるコンテンツモードで遊んでみました

self.bounds = mainView.frame; 

へ役立たず。

あなたは意味、投稿のように私はそれを使用してください:

mainView.frame = self.bounds; 

それは全く働いていない、との両方のビューのサイズは同じまま。 ここで私はresizeMaskで試してみましたが、まだ動作しませんでした。

これら2つの問題を解決するにはどうすればいいですか? ありがとうございました!

編集3

私はButtonTestViewController.xibButtonTest.xibビューのサイズをリサイズ、課題の一つを解決するために管理しました。 これは

self.bounds = CGRectMake(0, 0, mainView.frame.size.width, mainView.frame.size.height); 
     CGRect overlay2Frame = self.frame; 
     overlay2Frame.origin.x = round(overlay2Frame.origin.x); 
     overlay2Frame.origin.y = round(overlay2Frame.origin.y); 
     self.frame = overlay2Frame; 

hereから取られたぼやけた問題を解決するためのコードを使用して)私が何をしたか、私はまだ解決できない他の問題です。 ButtonTest.xibのビューは他のビューと一致するように大きくなりません。

答えて

15

あなたはこれを非常に簡単に行うことができます。私がこれを行う方法は、UIViewサブクラス(「MyView.m」と「MyView.h」と呼ばれる)を作成し、「MyView.xib」というnibを作成することです。

最初に、ペン先でFile's Ownerをクリックし、クラスを "MyView"に設定します。これにより、あなたのクラスのIBOutlets/ActionsがIBに表示されます。 1つのトップレベルビューをメインビューとして追加し、他のカスタム要素(UILabelsおよびUIImageViews)をメインUIViewのサブビューとして追加します。

次に、MyViewが初期化されたときに呼び出されるように、次のコードを追加します(覚えておいて、 - (id)initWithCoder:(NSCoder *)aDecoderから取得します)。

これはNSArrayのにあなたのペン先からのビュー階層をロードして、あなただけの1つのトップレベルのUIViewを持っていたことから、あなたは自分のカスタムUIViewのサブビューのように、そのを追加している何
NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; 
UIView *mainView = [subviewArray objectAtIndex:0]; 

//Just in case the size is different (you may or may not want this) 
mainView.frame = self.bounds; 

[self addSubview:mainView]; 

これにより、Interface BuilderでUIView(およびその他のUIViewのサブクラス)を設計できます。

EDIT:OPの編集に更新されました。

私がいつもこれをやったやり方は、まず上記の指示に従うことです。 1つの違いは、あなたのButtonTestペンで、UIViewのクラスをButtonTestに変更していますが、私はFile OwnerのクラスをButtonTestに変更します。その後、ButtonTest.mの内部には、loadNibNamedものを実行します。今度はそのオブジェクトをButtonTestViewController.xibに追加するには、UIView(またはButtonTestがサブクラス化されているUIButton)を追加し、そのクラスをButtonTestに変更します。

これはちょっと混乱しているので、私はファイルで分割しようとします。

ButtonTestViewController.xib:(ButtonTestから継承するものは何でもの)UIButtonを追加し、ButtonTest

ButtonTest.mにクラスを変更します。 "initWithCoder" メソッド内で、

の上に私が持っている "loadNibNamed" もののすべてを行いますButtonTest.xib:ファイルの所有者クラスをButtonTestに変更し、すべてのIBOutletとIBActionsをリンクします

+0

たいすべてのXIBファイル内ViewWrapperでUIViewの使用

extension UIView { /// Adds constraints to the superview so that this view has same size and position. /// Note: This fails the build if the 'superview' is 'nil' – add it as a subview before calling this. func bindEdgesToSuperview() { guard let superview = superview else { preconditionFailure("'superview' was nil – call 'addSubview(view: UIView)' before calling 'bindEdgesToSuperview()' to fix this.") } translatesAutoresizingMaskIntoConstraints = false ["H:|-0-[subview]-0-|", "V:|-0-[subview]-0-|"].forEach { visualFormat in superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: visualFormat, options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self])) } } } 

のUIViewに拡張子を追加します。彼はその後、他の.xibファイルでMyView.xibを使用し、カスタムインターフェイスを完全に編集する方法を尋ねています。 –

+0

マットが正しいですが、私は新しい質問で質問を編集しました。見てください。 – Idan

+0

私は私の答えをもう少し明確に編集しました。私はこれがあなたが探しているものだと思います。 – Ned

-1

クラスがUIButtonのサブクラスの場合、Interface Builderでライブラリを開くことができます。それとあなたはドラッグアンドドロップすることができます。

UIButtonをドラッグアンドドロップしてインスペクタペインでそのクラスを設定することもできます。

しかし、自分自身の.xibが混乱する可能性があるので、この場合は無視してください。

5

このソリューションは無限ループを作成しないと、私はそこに答えるために十分な評判を持っていない場合、あなたのいくつかはので、ここで、コメントに尋ねるが私の答えです:

ループが存在する場合は、あなたのXIBのルートビュー「カスタムクラス」がMyViewに設定されています。これにより、XIBからロードされたビューがMyView の初期化子を再度呼び出す状況が発生し、になるため、無限ループが作成されます。解決策は、 "カスタムクラス"はUIViewで、ファイルオーナーのクラスのみがMyViewに設定されている必要があります(IBOutletsとIBActionsを割り当てることができる)。

1

スウィフト3.0

は、作成したクラス

class ViewXIBfileClassView: UIView { 
..... 
} 

XIBファイルとビューを迅速ファイルを作成します。ViewXIBfileClassView

ラッパービュークラスを作成し

class ViewWrapper: UIView { 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     let view = UINib(nibName: "ViewXIBfileClassView_file", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! viewXIBfileClassView 
     self.addSubview(view) 
     view.bindEdgesToSuperview() 
    } 
} 

あなたは私はOPは遠くこれをすでに得ていると思います

関連する問題