1

.hクラスには次のものがあります。

extern CGFloat tableMarginSide;
extern CGFloat tableMarginTop;
extern CGFloat fromImageSize;
extern CGFloat keyboardHeightPortrait;
extern CGFloat keyboardHeightLandscape;

そして私の初期化で私はしました:

 CGFloat tableMarginSide = 20;
    CGFloat tableMarginTop = 20;
    CGFloat fromImageSize = 50;

    CGFloat keyboardHeightPortrait  = 210;
    CGFloat keyboardHeightLandscape  = 160;

    if (IS_IPAD){
        CGFloat tableMarginSide = 80;
        CGFloat tableMarginTop = 65;
        CGFloat fromImageSize = 50;

        CGFloat keyboardHeightPortrait = 260;
        CGFloat keyboardHeightLandscape = 350;
    }

警告が表示され、クラスでこのフロートを使用できないのはなぜですか?ちなみにプリプロセッサは使いたくない

4

1 に答える 1

2

で同じ名前の新しい変数を再宣言していますinit。メソッド内ではinit、宣言はそのブロックに対してローカルです。つまり、これは次のとおりです。

ヘッダ

extern CGFloat tableMarginSide;
extern CGFloat tableMarginTop;
extern CGFloat fromImageSize;
extern CGFloat keyboardHeightPortrait;
extern CGFloat keyboardHeightLandscape;

impl

CGFloat tableMarginSide = 20;
CGFloat tableMarginTop = 20;
CGFloat fromImageSize = 50;

CGFloat keyboardHeightPortrait  = 210;
CGFloat keyboardHeightLandscape  = 160;

@interface ...
- (id)init {
   self = [super init];
   if (self) {
     if (IS_IPAD)
       tableMarginSide = 80;
       tableMarginTop = 65;
       fromImageSize = 50;

       keyboardHeightPortrait = 260;
       keyboardHeightLandscape = 350;
     }
   }
}

そうは言っても、これはまさに、nib ファイルとストーリーボードが対処するように設計されている種類の問題です。

nib ファイルがなくても、このアプローチは避けます。これらのグローバルにアクセスする前に呼び出すことを確認することに大きく依存しinitます (注意を怠ると、これは簡単に起こりません)。より良いアプローチは、「疑似定数」を作成するのではなく、これらのクラスまたはインスタンス メソッドを作成することです (これらは実行時に変化するため、実際には一定ではありません)。

于 2012-10-02T19:50:37.183 に答える