1

ユーザーがテキスト フィールドに入力した製品の名前を読み取り、後で文字列に追加しようとしています。これは、ユーザーが単語を 1 つしか入力しない場合は正常に機能しますが、製品が複数の単語である場合、プログラムはクラッシュします。デバッガーを実行すると、NSString 製品の値が「変数は nsstring ではありません」と表示されます。このメソッドは、ユーザーが製品名を入力した後にリターン キーを押すとトリガーされます。

-(IBAction)textFieldReturn3:(id)sender
{
    [sender resignFirstResponder];
    product = inputtext.text;
}

これは、ユーザーが2シーン後にTwitterボタンを押したときにトリガーされるメソッドの一部です(私の目標は、ユーザーが何をツイートするかを決定しているときに、特定のメッセージをすでに表示することです)[はい、選択は0のいずれかに設定されていますまたは3]

- (IBAction)twitter:(id)sender
{
TWTweetComposeViewController *twitter = [[TWTweetComposeViewController alloc] init];
[fmt5 setNumberStyle:NSNumberFormatterDecimalStyle];
[fmt5 setMaximumFractionDigits:2];
[fmt5 setMinimumFractionDigits:2];
if (choice == @"0" || choice == @"3")
{
    str = @"I just bought a new ";
    str = [str stringByAppendingString:product]; // line where it crashes
    str = [str stringByAppendingString:@" for $"];
    str = [str stringByAppendingString:[fmt5 stringFromNumber:[NSNumber numberWithDouble:myDouble]]];
    [twitter setInitialText:str];
}

この問題を解決するにはどうすればよいですか? ありがとう。

4

1 に答える 1

3

たくさんの問題。本当の理由から始めましょう。

product = inputtext.text;

よくない。後で使用する場合、ビューが既に割り当て解除されている場合、そのテキスト プロパティは無効になります。それを参照するには、それを保持する必要があります。したがって、上記の行を次のように変更します。

[product release];
product = [inputtext.text retain];

productまた、最初のリリース呼び出しに関連するクラッシュを避けるために、nil に初期化することを忘れないでください。

第二に、あなたの比較は良くありません。

choice == @"0" || choice == @"3"

あなたが思っていることをしません。使用する

if ([choice isEqualToString:@"0"] || [choice isEqualToString:@"3"]) {

編集:マイナーな設計ポイントでもあります。テキストの一部を順番に追加して車輪を再発明しないでください。これは非常に読みにくいものです。NSString のクラス リファレンスを参照すると、次のメソッドがすぐに見つかります。

str = [NSString stringWithFormat:@"I just bought a new %@ for $%.2lf", product, myDouble];
于 2012-08-07T17:51:56.413 に答える