2011-11-13 10 views
2

私がしようとしていることは、ASP.Netでわかりやすく、自分の考えを調整する必要があるということですiOSでの開発)、しかし、私はXCode/Objective-Cでこのベストを達成する方法を理解することはできません。iOSフレームワークでASP.Netのようなユーザーコントロールを作成する

私がしたいことは、いくつかのボタンとラベルをレイアウトし、ASP.Netのユーザーコントロールのような再利用可能な形式でコードを書くことです。それから、その「パッケージ」を取って、ストーリーボードのビューの複数の場所でそれを使用します。

単一のコントロールをサブクラス化するための例がたくさんありましたが、いくつかのコントロールをパッケージ化して、それをストーリーボードにドラッグ/追加することができます。それは実現可能ですか?または、クラスファイルを作成する必要がありますが、手動ですべてのコントロールを追加してクラスにリンクしますか?または、カスタムクラスを使用してビュー/ストーリーボードにコントロールを動的に追加する方がよいかどうか

答えて

0

IBで設計したい場合は、もう少し足を運ぶ必要があります。

開始するには、コントロールを格納してコントローラとして動作させるために、NSObjectのサブクラスが必要です。それを賢明なものと呼んでください。私たちに私たちのコンポーネントを築くために、私たちの基本的な出発キャンバス

@interface MyWidget : UIView 

(はMyWidgetよりベター)IBは、へのハンドルを取得して使用することができますUIViewが必要になります。

@property (nonatomic, retain) IBOutlet UIView *view; 

は次に、このIVARにゲッター/セッターを与え、あなたのヘッダにこれを追加し、.M今

@synthesize view = _view; 

... 

- (void)dealloc; 
{ 
    [_view release]; 
    [super dealloc]; 
} 

にメモリ管理を行う開始するために単一のビューでペン先を作成し、File's Ownerを設定MyWidget。今度はctrl + clickになり、File's OwnerオブジェクトからUIViewオブジェクトにドラッグしてviewをドラッグする必要があります。だからこの時点で私たちのペン先は、MyWidgetクラスに接続する方法を知っていますが、私たちのMyWidgetクラスはペン先について知りません。

- (id)initWithFrame:(CGRect)frame;- (id)initWithCoder:(NSCoder *)aDecoder;の両方でnibを使用するようにクラスに指示する必要があるため、コードでクラスをインスタンス化するか、IBを使用してクラスをインスタンス化できます。

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self loadView]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder; 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self loadView]; 
    } 
    return self; 
} 

- (void)loadView; 
{ 
    [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]; 
    [self addSubview:self.view]; 
} 

outクラスがインスタンス化されると、それ自身がnibにフックされます。現時点では、あなたが通常どおりに標準UIViewControllerで作業する方法に戻ります。 xibに何かを追加して、コントローラーに接続して使用してください。すべての良い出発点で

のようになりますが...

MyWidget.h

#import <UIKit/UIKit.h> 

@interface MyWidget : UIView 

@property (nonatomic, retain) IBOutlet UIView *view; 

@end 

MyWidget.m

#import "MyWidget.h" 

@interface MyWidget() 

- (void)loadView; 

@end 

@implementation MyWidget 

@synthesize view = _view; 

- (void)dealloc 
{ 
    [_view release]; 
    [super dealloc]; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self loadView]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder; 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self loadView]; 
    } 
    return self; 
} 

- (void)loadView; 
{ 
    // MyWidget is the name of the xib as well 
    [[NSBundle mainBundle] loadNibNamed:@"MyWidget" owner:self options:nil]; 
    [self addSubview:self.view]; 
} 

@end 
関連する問題