Как динамически изменить заголовок кнопки (когда логическое значение имеет определенное свойство)

Я изучаю Objective-C и начал с создания простого калькулятора. Я ударил пару стен, хотя. У меня есть 2 дисплея: вводится текущий номер, а на меньшем отображается все, что было введено до сих пор. У меня тоже есть кнопка "очистить".

Я хочу, чтобы, если пользователь один раз нажмет кнопку «очистить», он очистит основной дисплей и изменит его заголовок на «AC» (все чисто). Если затем нажать еще раз, я хочу, чтобы он очистил меньший дисплей от всего, что было введено до сих пор.

Все это работает нормально, но у меня проблемы, потому что я хочу, чтобы кнопка назад была просто «очищена», когда пользователь начинает вводить другой номер.

У меня есть @property (неатомарное) BOOL userIsInTheMiddleOfEnteringANumber; и @synthesize для этого свойства.

Как я могу сделать так, чтобы всякий раз, когда userIsInTheMiddleOfEnteringANumber == YES, я мог установить кнопку очистки (или @property (nonatomic) BOOL allClear), которую я должен изменить?


person singmotor    schedule 27.06.2013    source источник


Ответы (2)


Одно из решений состоит в том, чтобы не @synthesize использовать свойство userIsInTheMiddleOfEnteringANumber, а написать код для него самостоятельно.

Добавьте в свой класс приватную переменную BOOL и напишите методы userIsInTheMiddleOfEnteringANumber и setUserIsInTheMiddleOfEnteringANumber:. Геттер должен вернуть переменную «поддержки»; установщик должен проверить старое и новое значение, чтобы убедиться, что старое значение равно NO, а новое значение равно YES. В этом случае установщик должен соответствующим образом изменить заголовок кнопки.

person Sergey Kalinichenko    schedule 27.06.2013
comment
хорошо, я мог бы сделать что-то вроде этого (я могу просто оставить @synthesize там, чтобы он имел дело с геттером, верно?)? - (void) setUserIsInTheMiddleOfEnteringANumber:(BOOL)userIsInTheMiddleOfEnteringANumber { if (userIsInTheMiddleOfEnteringANumber == YES) { _allClear = NO; } } но есть ли способ сослаться на саму кнопку? Потому что теперь мне нужно будет выяснить, как изменить заголовок кнопки, когда _allClear==NO - person singmotor; 27.06.2013
comment
@ Acoustic77 Я предположил, что свойство находится в контроллере представления представления, которое содержит кнопку, и в этом случае вы получаете ссылку на кнопку бесплатно. Если это на самом деле в другом классе, добавьте метод в контроллер представления, чтобы установить свойство userIsInTheMiddleOfEnteringANumber, и поместите туда логику. Ваша реализация неполная - вы не меняете значение резервной переменной. - person Sergey Kalinichenko; 27.06.2013
comment
в CalculatorViewController.h у меня есть свойства только для двух моих дисплеев. И @property (неатомарное) BOOL userIsInTheMiddleOfEnteringANumber; объявлен в CalculatorViewController.m, где у меня есть вышеупомянутые вещи. Извините за трудности, но я очень новичок в этом. когда вы говорите добавить метод в контроллер представления, вы имеете в виду перемещение свойства userIsInTheMiddleOfEnteringNumber в .h? и что такое резервная переменная? - person singmotor; 27.06.2013
comment
@ Acoustic77 Где тогда кнопка? Метод должен иметь доступ к кнопке. - person Sergey Kalinichenko; 27.06.2013
comment
в моем CalculatorViewController.m у меня есть это для кнопки: - (IBAction)clearPressed:(id)sender{if (self.allClear==NO) {NSUInteger dislength=[self.display.text length];self.inputlog.text =[self.inputlog.text substringToIndex:[self.inputlog.text length]-dislength];self.display.text = @0;[sender setTitle:@AC forState:UIControlStateNormal];self.allClear = YES;} else { [sender setTitle:@AC forState:UIControlStateNormal];self.inputlog.text = @;self.display.text = @0;self.allClear = YES;}} Кнопка была физически создана в раскадровке и перетащена с нажатой клавишей Ctrl в .m для создания этого действия - person singmotor; 27.06.2013
comment
тьфу, это беспорядок ^ но в основном я сделал кнопку в раскадровке и с нажатой клавишей Ctrl перетащил ее в свой CalculatorViewController.m как действие - person singmotor; 27.06.2013
comment
@ Acoustic77 Если кнопка находится в раскадровке, для нее тоже где-то должен быть IBOutlet. - person Sergey Kalinichenko; 27.06.2013
comment
О, кнопки не объявлены в .h моего представления, потому что они не должны были использоваться другими вещами. Так что я думаю, что могу объявить эту кнопку в .h, чтобы другие вещи могли ее изменить. - person singmotor; 02.07.2013
comment
@ Acoustic77 Acoustic77 Это нормально, если он находится в расширении класса в файле .m, если он правильно подключен к NIB. - person Sergey Kalinichenko; 02.07.2013
comment
что такое НИБ? Я объявил @property (слабый, неатомарный) IBOutlet UIButton *clearButton; в моем CalculatorViewController.h и я поместил [self.clearButton setTitle:@C forState:UIControlStateNormal]; в том месте, где я хотел, но не меняет название кнопки, когда программа доходит до этой строки. - person singmotor; 04.07.2013
comment
понятно! Просто нужно было перетащить и подключить кнопку к объявлению @property в моем .h - person singmotor; 04.07.2013

в методе viewdidload добавьте название заголовка кнопки как ясное

- (void)viewDidLoad{
[super viewDidLoad];
[myButton setTitle:@"Clear" forState:UIControlStateNormal];
}

а в методе который все очищает сделать заголовок кнопки на AC

- (void)clearAllAndACMethod{
if(userIsInTheMiddleOfEnteringANumber==Yes)
{
[myButton setTitle:@"AC" forState:UIControlStateNormal];
userIsInTheMiddleOfEnteringANumber=NO;
}
else{
another type code and 
[myButton setTitle:@"Clear" forState:UIControlStateNormal];

userIsInTheMiddleOfEnteringANumber=YES;
}
//remaining method with  

}

Измените значение логического значения в соответствии с вашими потребностями, потому что я не правильно понял значение логического значения, я думаю. попробуй так будет работать

person ashokdy    schedule 27.06.2013