修复预处理器宏

时间:2016-01-29 09:31:33

标签: ios objective-c iphone macros

我有以下示例代码,用于将警报视图显示为宏

#define SHOW_ALERT(title,msg,del,cancel,other) \
do { \
UIAlertView *_alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:del cancelButtonTitle:cancel otherButtonTitles:other,nil]; \
[_alert show]; \
} while(0);

致电使用

 SHOW_ALERT(@"Error!", @"Please Check!", nil, @"Ok", nil)

我正在尝试根据我的字符串传递来处理错误消息

SHOW_ALERT_STATUSCODE(@"404") // give error

这是我试过的

#define SHOW_ALERT_STATUSCODE(code) \
do { \
\NSString *errorMsg=@"";\
if([Status_code isEqualtoString:@"404"])\
\{errorMsg=@"Page Not Found";}\
\else if([Status_code isEqualtoString:@"401"])\
\{errorMsg=@"Authentication Failed";}\
\
UIAlertView *_alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:errorMsg delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok",nil]; \
[_alert show]; \
} while(0);

但它给我以下错误

enter image description here

3 个答案:

答案 0 :(得分:3)

在某些行的开头有虚假的反斜杠:

\NSString *errorMsg=@"";\

\{errorMsg=@"Page Not Found";}\

\else if([Status_code isEqualtoString:@"401"])\

您也可以传递code,但请测试Status_code

我建议扔掉那些不合时宜的垃圾,而是创建一个易于阅读和维护的方法:

- (void)showAlertForStatusCode:(NSUInteger)code
{
    NSString errorMsg = nil;
    if (code == 404)
        errorMsg = @"Page Not Found";
    else if (code == 401)
        errorMsg = @"Authentication Failed";
    else
        errorMsg = @"Unknown error";
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" 
                                                    message:errorMsg
                                                   delegate:self
                                          cancelButtonTitle:nil 
                                          otherButtonTitles:@"Ok", nil];
    [alert show];
}

答案 1 :(得分:0)

尝试这个。

  #define SHOW_ALERT_STATUSCODE(code)                     \
  \
  do {                                                    \
  \
 NSString *errorMsg=@"";                                  \
 if([code isEqualToString:@"404"])                     \
 {\
    errorMsg=@"Page Not Found";                           \
 }\
 else if([code isEqualToString:@"401"])                 \
 {\
     errorMsg=@"Authentication Failed";                   \
 }\
  \
   UIAlertView *_alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:errorMsg delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok",nil];                                 \
  \
  [_alert show];                                          \
} while(0);                                               \

除了前导'\'之外,您的代码没有任何问题。

答案 2 :(得分:0)

我建议不要使用宏来制作复杂的代码。

只需使用静态方法。

__unused static void showAlertForStatusCode(NSUInteger code)
{
    NSString *errorMsg = nil;
    if (code == 404)
        errorMsg = @"Page Not Found";
    else if (code == 401)
        errorMsg = @"Authentication Failed";
    else
        errorMsg = @"Unknown error";
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert"
                                                    message:errorMsg
                                                   delegate:nil
                                          cancelButtonTitle:nil
                                          otherButtonTitles:@"Ok", nil];
    [alert show];
}

您可以使用对象引用或使用self来调用此静态方法。 EXA: -

showAlertForStatusCode(400);

或使用

使用我在项目中使用的宏

#define AlertWithMessage(msg) [[[UIAlertView alloc] initWithTitle:@"Titile" message:msg delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] show]