我正在编写Objective In 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");
}
控制台DOES打印已处理。表明此按钮正在运行,因此问题在于以下代码行:
[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不能附加字符串以及我需要它为这个应用程序做的许多其他方法。我怎样才能做到这一点?
答案 0 :(得分:3)
NSMutableString
和NSString
大多可以互换。即如果某个方法需要NSString
,则可以将其传递给NSMutableString
。但是,这在其他方面不起作用,并且它们经常被复制并变得不可变。即使您将NSMutableString
传递给UILabel
的{{1}}属性,也会始终返回text
。
我怀疑你还有其他问题在这里发生。 也就是说,使用不可变字符串比使用可变字符串更容易。
您可以更改此代码:
NSString
进入此代码:
[displayString appendString:[NSString stringWithFormat:@"%i", digit]];
display.text = displayString;
因为display.text = [displayString stringByAppendingString:[NSString stringWithFormat@"%i",digit]];
使用接收者的内容(stringByAppendingString
)创建一个新的不可变字符串对象,并且该字符串作为参数传递(displayString
)。
我怀疑您的问题是[NSString stringWithFormat:@"%i",digit]
是displayString
。
添加一些NSLog来查找...
nil
添加-(IBAction)clickDigit:(UIButton *)sender
NSLog(@"Sender is %@",sender)
添加-(void)processDigit:(int)digit
这可以让您了解在Interface Builder中哪些对象是零或者连接错误。
答案 1 :(得分:1)
我面临同样的问题,我发现我在文件“Fraction_CalculatorViewController.m”的“viewDidLoad”函数中错过了这行代码
displayString =[NSMutableString stringWithCapacity:40];
这将解决iSA的问题。
答案 2 :(得分:0)
NSMutableString
NSString
。更具体地说,它是一个子类。只需分配它就可以了。