2013-06-18 2 views
0

На этот вопрос ответили много, но ни одно из опубликованных решений для меня не работает. Поэтому я подумал, что сделаю это. У меня есть boolean posNeg, и каждый раз, когда его значение изменяется, заголовок трех кнопок должен меняться, но они этого не делают.Измените текст UIButton, не созданный в Interface Builder

- (void) posNegButtonPressed{ 
    if (posNeg) { 
     posNeg = NO; 
     [oneButton setTitle:@"One" forState:UIControlStateNormal]; 
     [xButton setTitle:@"X" forState:UIControlStateNormal]; 
     [x2Button setTitle:@"X2" forState:UIControlStateNormal]; 
     NSLog(@"Was True"); 
    } 
    else{ 
     posNeg = YES; 
     [oneButton setTitle:@"-One" forState:UIControlStateNormal]; 
     [xButton setTitle:@"-X" forState:UIControlStateNormal]; 
     [x2Button setTitle:@"-X2" forState:UIControlStateNormal]; 
     NSLog(@"Was False"); 
    } 
} 

В NSLog находятся называют, так что я получаю контрастную последовательность «правда» и «Был False», но название каждого из кнопок никогда не обновляется.

Дополнительная информация:

Кнопки были инициализированы следующим

Заголовочный файл

Реализация файла

@implementation ... 

- (id)initWithFrame:(CGRect)frame{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self setUpButton : oneButton : UIButtonTypeRoundedRect : @"One" :UIControlStateNormal : @"Helvetica-Bold" : 20 
         : width - width/4 + 2 * initialWidth : height/3 + 6 * (buttonHeight + spaceBetweenButtons) 
         : width/4 - 2 * initialWidth : buttonHeight : @selector(oneButtonPressed) : UIControlEventTouchUpInside]; 

     [self setUpButton : xButton : UIButtonTypeRoundedRect : @"X" :UIControlStateNormal : @"Helvetica-Bold" : 20 
         : width - width/4 + 2 * initialWidth : height/3 + 7 * (buttonHeight + spaceBetweenButtons) 
         : width/4 - 2 * initialWidth : buttonHeight : @selector(xButtonPressed) : UIControlEventTouchUpInside]; 

     [self setUpButton : x2Button : UIButtonTypeRoundedRect : @"X\u00B2" :UIControlStateNormal : @"Helvetica-Bold" : 20 
         : width - width/4 + 2 * initialWidth : height/3 + 8 * (buttonHeight + spaceBetweenButtons) 
         : width/4 - 2 * initialWidth : buttonHeight : @selector(x2ButtonPressed) : UIControlEventTouchUpInside]; 
} 

- (void) setUpButton: (UIButton *) button : (UIButtonType *) buttonType : (NSString *) title : (UIControlState *) controlState : (NSString *) font : (int) size : (double) xPos (double) yPos : (double) width : (double) height : (SEL) selectorMethod :(UIControlEvents *) controlEvent 
{ 
    button = [UIButton buttonWithType:buttonType]; 
    button.frame = CGRectMake(xPos, yPos, width, height); 
    [button setTitle:title controlState ]; 
    [button addTarget:self action: selectorMethod forControlEvents:controlEvent]; 
    [self addSubview:button]; 
    button.titleLabel.font = [UIFont fontWithName:font size:size]; 
} 

@end 

Я попытался [mybutton setNeedsDisplay], но это не сработало ни

Любые идеи? Правильно ли мои кнопки не инициализированы?

Редактировать 1: Добавлено NSLog(@"%@ %@ %@", oneButton, xButton, x2Button); до последней строки в initWithFrame в соответствии с просьбой и получено (ноль) (null) (null). Кто-нибудь знает, почему это так?

+0

ли кнопка инициализации правильно .... и, пожалуйста, проверьте condtions ... – IronManGill

+0

Сделайте одну вещь в вашем методе initWithFrame поставить эту последнюю строку. NSLog (@ "% @% @% @", oneButton, xButton, x2Button). Я сомневаюсь в ссылке. Поэтому проверьте и сообщите нам, что у вас получилось. – CRDave

+0

@CRDave Я сделал то, что вы просили, и получил (null) (null) (null). Что я делаю не так? – josealvarado111

ответ

0

Это проблема прохода по значению и указателю.

При вызове этого:

[self setUpButton : oneButton : UIButtonTypeRoundedRect : @"One" :UIControlStateNormal : @"Helvetica-Bold" : 20 
         : width - width/4 + 2 * initialWidth : height/3 + 6 * (buttonHeight + spaceBetweenButtons) 
         : width/4 - 2 * initialWidth : buttonHeight : @selector(oneButtonPressed) : UIControlEventTouchUpInside]; 

Значение OneButton передается как значение не как указатель (который Nil другая проблема).

Итак, что бы вы ни изменили с помощью кнопки (UIButton *), не будет отображаться для одной кнопки или двух других.

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

Попробуйте это:

- (UIButton *) setUpButton: (UIButtonType *) buttonType : (NSString *) title : (UIControlState *) controlState : (NSString *) font : (int) size : (double) xPos : (double) yPos : (double) width : (double) height : (SEL) selectorMethod :(UIControlEvents *) controlEvent 
{ 
    UIButton * button = [UIButton buttonWithType:buttonType]; 
    button.frame = CGRectMake(xPos, yPos, width, height); 
    [button setTitle:title controlState ]; 
    [button addTarget:self action: selectorMethod forControlEvents:controlEvent]; 
    [self addSubview:button]; 
    button.titleLabel.font = [UIFont fontWithName:font size:size]; 
    return button; 
} 

И называют это как:

oneButton = [self setUpButton : UIButtonTypeRoundedRect : @"One" :UIControlStateNormal : @"Helvetica-Bold" : 20 
         : width - width/4 + 2 * initialWidth : height/3 + 6 * (buttonHeight + spaceBetweenButtons) 
         : width/4 - 2 * initialWidth : buttonHeight : @selector(oneButtonPressed) : UIControlEventTouchUpInside]; 

Комментарий мне, если вы сталкиваетесь с любой проблемой.

Все лучшее ....

+0

Большое спасибо за помощь. Ваши изменения исправили мою проблему. Меня смутил проход по значению и указателю, но теперь это имеет смысл. – josealvarado111

0

Если оно создано XIB, тогда вам нужно установить IBOutlet для каждой кнопки. И я думаю, вы сделали глупую ошибку. Поэтому, пожалуйста, проверьте, подключен ли ваш IBOutlet или нет. Потому что в этом коде нет ошибки.

1

Пожалуйста, установите IBOutlet для кнопки, если вы используете XIB, ниже код работает для меня

- (IBAction)sliderButtonAction:(UIButton *)sender { 

    [self.suggestedTableView reloadData]; 
    if ([sender.titleLabel.text isEqualToString:@"<<"]) { 
     [sender setTitle:@">>" forState:UIControlStateNormal]; 
    } 
    else { 
     [sender setTitle: @"<<" forState: UIControlStateNormal]; 

    } 
} 
Смежные вопросы