2

我正在从 Programming In Objective-C 2.0 书中制作一个分数计算器应用程序。我正在为 Lion 使用 XCode 4.1。我已经完全成功地没有在代码中输入任何错误。但是当我在应用程序运行时按下数字按钮时,标签不会输入任何文本。当我按下数字按钮时,它应该找到 UIButton senders 标签(我已分配)

   -(IBAction)clickDigit:(UIButton *)sender {

int digit = sender.tag;

[self processDigit:digit];
    }

并将其发送到此代码:

  -(void)processDigit:(int)digit {

currentNumber = currentNumber * 10 + digit;

[displayString appendString:[NSString stringWithFormat:@"%i", digit]];
display.text = displayString;

NSLog(@"Processed");

    }

控制台确实打印已处理。说明这个按钮是起作用的,所以问题出在这行代码:

[displayString appendString:[NSString stringWithFormat:@"%i", digit]];
display.text = displayString;

display 是一个 UILabel,它是一个实例变量,但它不是 IBOutlet,而是在其属性中声明为 IBOutlet。

@property (nonatomic, retain)IBOutlet UILabel *display;

我已经使用连接到代码助手的东西连接了 .xib 屏幕上的标签。我可以从字面上将它与声明联系起来。所以我把它和房产联系起来。

现在,问题在于 display 是一个 UILabel 并且它的 text 属性需要一个 NSString 而不是 NSMutableString 对吗?但是一个 NSString 不能附加一个字符串和我需要它为这个应用程序执行的许多其他方法。我怎样才能使这项工作?

4

3 回答 3

3

NSMutableString并且NSString大部分是可以互换的。即,如果一个方法需要一个NSString,你可以给它一个NSMutableString. 但是,这不起作用,它们经常被复制并变得不可变。即,即使你传递一个NSMutableStringtoUILabeltext属性,它总是会返回一个NSString返回。

我怀疑你这里还有其他问题。也就是说,使用不可变字符串通常比使用可变字符串更容易。

您可以更改此代码:

[displayString appendString:[NSString stringWithFormat:@"%i", digit]];
display.text = displayString;

进入这段代码:

display.text = [displayString stringByAppendingString:[NSString stringWithFormat@"%i",digit]];

因为使用接收器 ( ) 的内容和作为参数 ( ) 传递的字符串stringByAppendingString创建了一个新的不可变字符串对象。displayString[NSString stringWithFormat:@"%i",digit]

我怀疑你的问题displayStringnil. 添加一些 NSLog 以找出...

  1. -(IBAction)clickDigit:(UIButton *)sender添加_NSLog(@"Sender is %@",sender)
  2. -(void)processDigit:(int)digit添加_NSLog(@"Digit is %i and displayString is %@ and display is %@", digit, displayString, display);

这应该让您了解哪些对象在 Interface Builder 中是 nil 或连接不良的。

于 2011-09-30T23:45:37.360 回答
1

我面临同样的问题,我发现我错过了文件“Fraction_CalculatorViewController.m”中函数“viewDidLoad”的这行代码

 displayString =[NSMutableString stringWithCapacity:40];

这将解决 iSA 的问题。

于 2014-12-25T07:08:16.217 回答
0

一个NSMutableString 一个NSString。更具体地说,它是一个子类。只需分配它,它就会工作。

于 2011-09-30T23:42:52.030 回答