4

私のiOSアプリケーションには、すべてのビューで使用しなければならないコードのチャックがあります-関数/メソッドでそれを使用することはできません-#defineを使用して、その識別子を使用できる方法があるかどうか疑問に思っていました。必要とされている。以下はサンプルコードです。

#deinfe識別子に置き換えたいコード

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(_gotECSlidingViewAnchorRightOrRightrNotification) 
                                             name:ECSlidingViewTopDidAnchorLeft 
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(_gotECSlidingViewAnchorRightOrRightrNotification) 
                                             name:ECSlidingViewTopDidAnchorRight 
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(_gotECSlidingViewTopDidResetNotification)
                                             name:ECSlidingViewTopDidReset 
                                           object:nil];

だから私はそれを #define して ViewDidLoad メソッド内で使用するにはどうすればよいのだろうかと思っていましたか?

4

4 に答える 4

2

これはあなたの質問に直接答えるものではありませんが、プリプロセッサの多くの頭痛の種に対処してきた古い C++ プログラマとして、これに #define を使用しないことをお勧めします。

いくつかのオプション...

  1. 2 つのセレクターを使用して基本クラス (UIViewController から派生) を定義します。セレクターは、派生クラスでオーバーライドできます。

    @interface YourBaseCass : UIViewController

    • (void)viewDidLoad; // ここにオブザーバーのロジックを追加します
    • (void)_gotECSlidingViewAnchorRightOrRightrNotification;
    • (void)_gotECSlidingViewTopDidResetNotification;

    @終わり

    @implementation YourBaseCass

    - (void)viewDidLoad //make sure you call me from the derived class
    {
        [super viewDidLoad]
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(_gotECSlidingViewAnchorRightOrRightrNotification)
                                                     name:ECSlidingViewTopDidAnchorLeft
                                                   object:nil];
    
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(_gotECSlidingViewAnchorRightOrRightrNotification)
                                                     name:ECSlidingViewTopDidAnchorRight
                                                   object:nil];
    
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(_gotECSlidingViewTopDidResetNotification)
                                                     name:ECSlidingViewTopDidReset
                                                   object:nil];
    }
    

    @終わり

  2. 機能をグローバルな静的メソッドに配置します (サブクラス化が必要ない場合)。これにより、デバッグが容易になります。

    • (void)addObserversForObject:(id)object{ [[NSNotificationCenter defaultCenter] addObserver:object selector:@selector(_gotECSlidingViewAnchorRightOrRightrNotification) name:ECSlidingViewTopDidAnchorLeft object:nil];

      [[NSNotificationCenter defaultCenter] addObserver:object
                                               selector:@selector(_gotECSlidingViewAnchorRightOrRightrNotification)
                                                   name:ECSlidingViewTopDidAnchorRight
                                                 object:nil];
      
      [[NSNotificationCenter defaultCenter] addObserver:object
                                               selector:@selector(_gotECSlidingViewTopDidResetNotification)
                                                   name:ECSlidingViewTopDidReset
                                                 object:nil];
      

      }

于 2013-03-12T15:24:56.840 に答える
1

コードがまさにそのようなものであると想定されている場合、これでうまくいくはずです。それ以外の場合は、に引数を付けて、#defineそれに関するいくつかのことを変更できます

#define identifier do{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_gotECSlidingViewAnchorRightOrRightrNotification) name:ECSlidingViewTopDidAnchorLeft  object:nil];\
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_gotECSlidingViewAnchorRightOrRightrNotification) name:ECSlidingViewTopDidAnchorRight object:nil];\
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_gotECSlidingViewTopDidResetNotification) name:ECSlidingViewTopDidReset object:nil];\
} while (0);
于 2013-03-12T07:22:16.597 に答える
1

これを使用できます:

各行の末尾にスペースの後に \ を置くと、コンパイラが新しい行をチェックしたり、Enter キーが押されたりするのを防ぎます。これにより、コードが読みやすくなります。次に、メソッドのどこでも MY_NOTIFICATIONS を使用できます。

#define MY_NOTIFICATIONS [[NSNotificationCenter defaultCenter] addObserver:self \
selector:@selector(_gotECSlidingViewAnchorRightOrRightrNotification) \
name:ECSlidingViewTopDidAnchorLeft \
object:nil]; \
\
[[NSNotificationCenter defaultCenter] addObserver:self \
                                         selector:@selector (_gotECSlidingViewAnchorRightOrRightrNotification) \
                                             name:ECSlidingViewTopDidAnchorRight \
                                           object:nil]; \
\
[[NSNotificationCenter defaultCenter] addObserver:self \
                                         selector:@selector(_gotECSlidingViewTopDidResetNotification) \
                                             name:ECSlidingViewTopDidReset \
                                           object:nil]; \
于 2013-03-12T07:26:33.123 に答える
0

プリプロセッサに依存しないでください。これはスタイルが悪く、しばしば微妙な混乱を招きます。そして、これらすべてのファイルにマクロを #include する必要があります。

代わりに、通知を処理するクラスを定義します

@interface ECSReceptionist
      - (id) initFor: (id) observer;
@end

これはクラスにとっては少し軽量に見えるかもしれませんが、後で責任を与えることができます。たとえば、受付係は通知のために自分自身を登録し、日常的な雑用を自律的に処理することもできます。

プリプロセッサーの回避:

  • あなたの意図をより明確にします
  • 微妙な構文の混乱を避け、正気を保つ
  • デバッグがはるかに簡単になります
  • さらなるリファクタリングの機会を提供
  • ユニットテスト用のテストフックを提供します
于 2013-03-12T15:54:46.107 に答える