1

我正在尝试读取用户在文本字段中输入的产品名称,然后将其添加到字符串中。当用户只输入一个词时,这很好用,但是当产品超过一个词时,程序就会崩溃。当我运行调试器时,NSString 产品的值被列为“变量不是 nsstring”。当用户在输入产品名称后点击返回时触发此方法:

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

这是当用户在两个场景后点击 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;

不好。如果您稍后使用它,当您的视图已经被释放时,它的 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 回答