0
UIAlertView *message = [[UIAlertView alloc] initWithTitle:[[LanguageManager sharedLanguageManager] get:@"Notice"]
                                                  message:[NSString stringWithFormat:[[LanguageManager sharedLanguageManager] get:@"Notice_Text"]]
                                                 delegate:nil
                                        cancelButtonTitle:[[LanguageManager sharedLanguageManager] get:@"Close"]
                                        otherButtonTitles:nil];

こんにちは、上記のコードを説明させてください。基本的には、LanguageManager シングルトン クラスを介してUIAlertViewデータを読み込んで呼び出します。.plistLanguageManager の get 関数は、基本的にNSString*. クラスを使用する必要があることはわかっNSLocalizedStringていますが、このクラスをしばらく使用していたので、これに固執することにしました。

私の問題は "message:" パラメータにあります。読み取ろうとしている文字列には次のような書式設定文字が含まれ\nていますが、正しく出力され\nず、印刷すると改行ではなく表示されます。「フォーマット文字列は文字列リテラルではありません」という警告も表示されます。アプリの他の部分は、同様の方法を使用して、正しく機能する文字列を返しますが、文字%dだけが機能しません。%f'\n'

どうすればこれを克服できるか、誰にもわかりませんか?

4

1 に答える 1

1

「\n」は「フォーマット文字」ではありません。コンパイラはそれを適切なコードに変換します。文字列に「\」および「n」文字が含まれることはありません。

したがって、文字列が (Objective-)C(++) コンパイラによってコンパイルされていないソースからのものである場合、「\n」は 2 文字だけになります。次のようなもので自分でやらない限り、何もそれらを改行に変えることはありません

NewString=[MyString stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];

2 つの異なる文字列に注意してください。最初のケースでは、"\" はコンパイラが \n -> 改行変換を実行するのを防ぎますが、2 番目の文字列は実際の改行になります。

非リテラル形式の文字列に関する警告は、やや無意味です。私はまだそれを取り除く良い方法を見つけていません (今のところ、clang++ >= 4.0 で -Wno-format-nonliteral を使用して完全に無効にします)。

于 2012-08-15T08:47:33.820 に答える