2

Programming In Objective-C 2.0 本から分数計算アプリを作成しています。Lion 用の XCode 4.1 を使用しています。コードにエラーを入力することなく、完全かつ正常に完了しました。しかし、アプリの実行中に数字ボタンを押すと、ラベルにテキストが入力されません。数字ボタンを押すと、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 プロパティが NSMutableString ではなく NSString を必要とするという事実にあります。しかし、NSString は文字列や、このアプリで必要な他の多くのメソッドを追加することはできません。どうすればこれを機能させることができますか?

4

3 に答える 3

3

NSMutableStringほとんどNSString交換可能です。つまり、メソッドに が必要な場合はNSString、 を渡すことができますNSMutableString。ただし、これは他の方法では機能せず、多くの場合、コピーされて不変になります。つまり、NSMutableStringtoUILabeltextプロパティを渡しても、常にNSStringback が返されます。

ここで別の問題が発生していると思われます。とはいえ、多くの場合、変更可能な文字列よりも変更できない文字列を操作する方が簡単です。

このコードは次のように変更できます。

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

このコードに:

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

stringByAppendingStringレシーバーの内容 ( displayString) とパラメーターとして渡された文字列( ) を使用して、新しい不変文字列オブジェクトを作成するため[NSString stringWithFormat:@"%i",digit]です。

あなたの問題は だと思いdisplayStringますnil。調べるためにいくつかの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);

これにより、どのオブジェクトが nil であるか、Interface Builder で正しく接続されていないかがわかります。

于 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 に答える