2012-03-09 3 views
4

IBをアシスタントビューと組み合わせて使用​​する場合、IB内の要素を制御して.hファイルにドラッグし、コンセントを作成します。変数宣言ブロック内またはブロック外のいずれかに2つの場所のいずれかにドラッグできます。あなたは、可変ブロックの内側にそれをドラッグするとIBOutlet、変数、プロパティ、またはその両方を接続していますか?

あなたはこのような何かを得る:ブロックの外側にドラッグ

@interface MyViewController : UIViewController { 
    IBOutlet UIButton *foo; 
} 

はあなたのような何かを与える....私が考えた

@interface ViewController : UIViewController { 
} 
@property (retain, nonatomic) IBOutlet UIButton *foo; 

彼らはどう違っていて、私はちょっと混乱しています。私は、合成されたプロパティがいくつかの魔法を行い、実行時にインスタンス変数を作成することを理解しています(64ビット/ ARMのみ)。だから私は2つのオプションの仕組みを理解していると信じています。

何が最適ですか?最初のオプションはコード生成が少なく、簡単です。

2番目のバージョンではパブリックアクセサリやミューテータが提供されていますが、クラス外のアウトレットにアクセスすることはほとんどありません(ほとんどの場合、カプセル化されています)。私がiOSの仕事を始めた時から、私はこのオプションを独占的に使用しました。

ほとんどの場合、何もないか、変数ベースのアウトレットに切り替える必要がありますか?

答えて

1

短い回答:どちらにも大きな違いはありません。

長い回答:設定/ミューテータメソッドを使用する場合は、ブロックの外にドラッグします。メソッドを気にせず、変数に直接アクセスしてブロック内にまっすぐな変数を入れるのはおそらく道のりです。

公共の可視性: あなただけの変数としてIBOutletを指定した場合、あなたは外部からのアクセスを防ぐために@privateまたは@protectedを使用することができます。何らかの理由で実際にが必要な場合は、プロパティを.hから.mファイルのクラス拡張に移動することで、パブリックな可視性を制御することができます。

結論:自分自身、私はストレート変数宣言に固執し、余分なものが必要なときのための他のオプションを保存します。

0

IBOutletsは、.mファイルで実際に作業する予定がない限り、ブロックの中で一番です。

両方を持つことができます。可変ブロックの内部は基本的には基本的にすべてIBActionsで使用するためのものです。

プロパティは、.mファイルでさらにカスタマイズするために使用できます。

また、両方を使用することもできます。使用する範囲によって異なります。プロパティ宣言にIBOutletを宣言する

+0

.mで使用しないIBOutletは何ですか?アクションは参照に渡されるので、実際にはIBActionsには必要ありません。 なぜ私はこの時点で両方を望んでいますか?コンパイラが実行時に私のインスタンス変数を追加し、プロパティを使用するときに私のためにインスタンス変数を管理する場合、手動でそれを追加することはありますか? – DBD

+0

webviewなど、.mでさらに実装する必要があるものがある場合にのみ、両方を必要とします。あなたはアクションのためにそれを接続する可変コンセント、ホームページ、ロードリクエストなどの機能を追加するプロパティを必要とします。 – JTApps

1

能力が以前@property (retain, nonatomic) IBOutlet UIButton *foo;

比較的新しく、あなたは中括弧内IBOutlet UIButton *fooを宣言して、プロパティを合成しなければなりませんでした。今、中括弧でIBOutletを宣言することは冗長です。

プロパティを宣言するための2つのオプションがあります。オプション1はあなたの.hファイルに宣言します。それは公開されます。代わりに、.mファイルに次のようにプライベートインターフェイスを作成することもできます。

@interface MYCLASS() 
@end 

ここでプロパティを宣言します。私がそのプロパティへのパブリックアクセスを必要としない限り(これは例外ではなく、MVC規約に準拠している場合は標準でなければならない)、これを行うのが私の好みです。

+0

私はクラス拡張を頻繁に使用しますが、私はIBOutletsのために使用することは考えていませんでした。私はちょうどこれとIBActionクラスの拡張(これはさらに良い)のいくつかのテストを行ったが、Xcodeのサポートはかなり悪いです。これは.hのメソッド宣言を詰め込むことを主張し、手動で.mファイルに移動する必要があります。アイデアのために+1。 – DBD

+0

はい、私は明確にすべきだと思います。古典的なXcodeの方法でドラッグしたい場合は、それらを.hファイルに入れなければなりません。しかし、私の意見では、もっと簡単な方法があります。 IBActionsの場合、インターフェースセクションで宣言する必要はありません。アシスタントエディタを使用して、ストーリーボードボタンからIBActionインプリメンテーションにドラッグしてリンクすることができます。たとえば、 ' - (IBAction)buttonPressed:(id)sender {}; 'のように.mファイルにIBActionを実装するだけです。プライベートIBOutletsの場合、ストーリーボードからプライベートインターフェイス '@interface MYCLASS()@ end'にCtrl +ドラッグできます。 –

関連する問題