Присвоение NSMutableString тексту UILabel - PullRequest
2 голосов
/ 01 октября 2011

Я делаю приложение калькулятора фракций из книги «Программирование в Objective-C 2.0». Я использую XCode 4.1 для 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, а его текстовое свойство требует NSString, а не NSMutableString, верно? Но NSString не может добавить строку и многие другие методы, которые мне нужны для этого приложения. Как я могу сделать эту работу?

Ответы [ 3 ]

3 голосов
/ 01 октября 2011

NSMutableString и NSString в основном взаимозаменяемы.Т.е. если метод требует 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",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);

Thisдолжен дать вам представление о том, какие объекты имеют ноль или плохо связаны в Интерфейсном Разработчике.

1 голос
/ 25 декабря 2014

Я столкнулся с той же проблемой, я обнаружил, что пропустил эту строку кода в функции "viewDidLoad" в файле "Fraction_CalculatorViewController.m"

 displayString =[NSMutableString stringWithCapacity:40];

это решит проблему iSA.

0 голосов
/ 01 октября 2011

NSMutableString - это NSString. Точнее, это подкласс. Просто назначьте его, и он будет работать.

...