4

我的 iOS 应用程序中有一小段代码,我必须在每个视图中使用 - 不能在函数/方法中使用它 - 所以我想知道是否有任何方法可以使用 #define 并在其中使用它的标识符是必须的。下面是示例代码。

我想用#deinfe identifer 替换的代码

[[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. 使用您的两个选择器定义一个基类(从 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

你可以使用这个:

在每行末尾的空格后放置 \,这可以防止编译器检查新行或按下回车键。这使得代码可读。然后,您可以在方法中的任何位置使用 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

对于一个类来说,这可能看起来有点轻量级,但您可以稍后赋予它责任。例如,接待员也可能会为自己注册通知并自主处理一些日常琐事。

避免预处理器:

  • 让你的意图更清晰
  • 避免微妙的句法 tsorus,节省理智
  • 使调试更容易
  • 提供进一步重构的机会
  • 给你一个单元测试的测试钩子
于 2013-03-12T15:54:46.107 回答