我正在根据《Objective-C 2.0 编程》一书制作一个分数计算器应用程序。我正在使用 XCode 4.1 for Lion。我已经完全成功地在代码中输入了任何错误。但是,当我在应用程序运行时按数字按钮时,标签不会输入任何文本。当我按下数字按钮时,它应该找到 UIButton 发送者标签(我已分配)
-(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 无法附加字符串以及我需要它为该应用程序执行的许多其他方法。我怎样才能做到这一点?
最佳答案
NSMutableString
和 NSString
大多数情况下可以互换。 IE。如果方法需要 NSString
,您可以向其传递 NSMutableString
。但是,反之则不行,而且它们经常被复制并变得不可变。即,即使您将 NSMutableString
传递给 UILabel
的 text
属性,它也始终会返回 NSString
。
我怀疑您这里还存在其他问题。 也就是说,使用不可变字符串通常比使用可变字符串更容易。
您可以更改此代码:
[displayString appendString:[NSString stringWithFormat:@"%i", digit]];
display.text = displayString;
进入这段代码:
display.text = [displayString stringByAppendingString:[NSString stringWithFormat@"%i",digit]];
因为 stringByAppendingString
使用接收者的内容 (displayString
) 和作为参数传递的字符串 ([NSString stringWithFormat:@ “%i”,数字]
)。
我怀疑您的问题是 displayString
为 nil
。
添加一些 NSLog 来找出...
- 到
-(IBAction)clickDigit:(UIButton *)sender
添加NSLog(@"Sender is %@",sender)
- 到
-(void)processDigit:(int)digit
添加NSLog(@"Digit is %i and displayString is %@ and display is %@", digital, displayString, display );
这应该让您了解哪些对象为零,或者在 Interface Builder 中连接不良。
关于objective-c - 将 NSMutableString 分配给 UILabel 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7617079/