0

iOSで簡単な「OK」ダイアログボックスを作成して表示するための簡単なマクロを作成してみました。

#define ALERT_DIALOG(title,message) \
do\
{\
    UIAlertView *alert_Dialog = [[UIAlertView alloc] initWithTitle:(title) message:(message) delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];\
    [alert_Dialog show];\
} while ( 0 )

コードで使用しようとすると、次のようになります。

ALERT_DIALOG(@"Warning", @"Message");

エラーが発生します:

解析の問題。期待される ']'

@そして、エラーは直前の2番目を指しているよう"Message"です。

ただし、マクロをコピーして貼り付けるだけでは、次のエラーは発生しません。

NSString *title = @"Warning";
NSString *message = @"Message";
do
{
    UIAlertView *alert_Dialog = [[UIAlertView alloc] initWithTitle:(title) message:(message) delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert_Dialog show];
} while ( 0 );

マクロでObjective-cコンストラクトを使用することに反対するものはありますか?それともそれは何か他のものですか?

4

2 に答える 2

1

マクロの問題は、inの両方の出現message

... [[UIAlertView alloc] initWithTitle:(title) message:(message) ...

に置き換えられ@"Message"、結果として

.... [[UIAlertView alloc] initWithTitle:(@"Warning") @"Message":(@"Message") ...

構文エラーが発生します。

これをマクロとして定義する価値があるとは思いませんが、もしそうするなら、展開されるべきではない場所で発生しないマクロ引数を使用する必要があります。

#define ALERT_DIALOG(__title__,__message__) \
do\
{\
    UIAlertView *alert_Dialog = [[UIAlertView alloc] initWithTitle:(__title__) message:(__message__) delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];\
    [alert_Dialog show];\
} while ( 0 )

または類似。

于 2013-01-07T20:14:07.140 に答える
0

マクロとして宣言する代わりに、代わりに C 関数として宣言できます。

void ALERT_DIALOG(NSString *title, NSString *message) {
    UIAlertView *alert_Dialog = [[UIAlertView alloc] initWithTitle:(title) message:(message) delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];\
    [alert_Dialog show];
}
于 2013-01-07T19:56:40.703 に答える