我的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方法中使用它?
答案 0 :(得分:2)
这并没有直接回答你的问题,但作为一个处理过预处理器的许多令人头疼的老C ++程序员,我建议不要使用#define来实现这个目标。
几个选项......
使用两个选择器定义基类(从UIViewController派生)。可以在派生类中重写选择器。
@interface YourBaseCass:UIViewController
@end
@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];
}
@end
将您的功能放在全局静态方法中(如果子类化不是您的事情)。这将更容易调试。
(无效)addObserversForObject:(ID)对象{ [[NSNotificationCenter defaultCenter] addObserver:object 选择器:@selector(_gotECSlidingViewAnchorRightOrRightrNotification) 名称:ECSlidingViewTopDidAnchorLeft 对象:无];
[[NSNotificationCenter defaultCenter] addObserver:object
selector:@selector(_gotECSlidingViewAnchorRightOrRightrNotification)
name:ECSlidingViewTopDidAnchorRight
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:object
selector:@selector(_gotECSlidingViewTopDidResetNotification)
name:ECSlidingViewTopDidReset
object:nil];
}
答案 1 :(得分: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);
答案 2 :(得分: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]; \
答案 3 :(得分:0)
不要依赖预处理器。这是糟糕的风格,往往导致微妙的混乱。而且你仍然需要#include所有这些文件中的宏。
相反,定义一个类来处理通知
@interface ECSReceptionist
- (id) initFor: (id) observer;
@end
对于一个类来说,这似乎有点轻量级,但您可以稍后赋予它职责。例如,接待员也可以自己注册通知并自动处理一些例行事务。
避免预处理器: