2010-03-19 38 views
3

我想通过代码设置UIButton的标题。我发现自己必须为UIControlStateNormal,UIControlStateHighlighted,UIControlStateDisabled和UIControlStateSelected调用 - [UIButton setTitle:forState:]。而这甚至不考虑这些国家的所有组合。使用单个方法调用设置UIButton的标题?

不用说,这是令人厌烦的。是否有一个我可以做的调用,将设置一个字符串作为所有状态的标题? (因为,我假设在95%的情况下,这是所需的行为?)

回答

9

是的,你当然可以。 From the docs

在一般情况下,如果一个属性是不是一个国家规定 ,默认是 使用UIControlStateNormal值。 如果未设置UIControlStateNormal 的值,则属性将默认为 为系统值。因此,至少在 处,应该将 的值设置为正常状态。

所以,只需设置标题UIControlStateNormal,你就是金。

+5

在实践中,我发现情况似乎并非如此:文本神秘地消失,当一个按钮被点击等。这就是说,我不知道我可以重新创建这些情况。如果我发现问题,我会在这里发布。谢谢! – 2010-03-19 18:09:09

7

像Mr./Ms。青蛙说,设置标题为UIControlStateNormal通常会做伎俩。唯一的例外是如果标题已经设置为其他状态。 UIControlState是一个面具,这样你就可以掩盖你的屁股像这样:

[button setTitle:@"Title" forState:UIControlStateNormal|UIControlStateHighlighted| UIControlStateDisabled|UIControlStateSelected] 

如果你试图要简洁:

#define kAllControlStates (UIControlStateNormal|UIControlStateHighlighted| UIControlStateDisabled|UIControlStateSelected) 
[button setTitle:@"Title" forState:kAllControlStates]; 

还是简洁和不透明:

[button setTitle:@"Title" forState:0xffff]; 

更新:我应该在回答之前测试过。事实证明,像UIControlStateHighlighted|UIControlStateDisabled这样的掩码表示控件同时高亮显示禁用的状态。我错误地认为该掩码表示“高亮已禁用”。总而言之,你最好用青蛙先生的回答。

+4

我发现这不适合我。文字没有显示在按钮上。我想知道是否因为UIControlStateNormal等于0,使它在掩码中相当无用? – 2010-04-14 21:22:13

+0

Mr. Frog :) 15chars – 2010-04-14 23:18:45

+0

@George:你说得对。看起来我的回答不正确。我会添加一个注释。 – Tom 2010-04-14 23:59:58

0

为UIButton创建一个类别方法,一次为所有状态设置它。

0

虽然回落到UIControlStateNormal状态的值可能已经足够99%的时间了,但我已经为1%用例提出了解决这个问题的方案。 (我有一个子类中的应用程序定义状态,这意味着回到正常状态将是不正确的。)

即时回复已被接受,我在此发布它的完整性。基本上,它为状态设置属性,以及您指定的各个附加状态的每个组合。

@interface UIButton (AdditionalStates) 
- (void)setTitle:(NSString *)title forState:(UIControlState)state additionalStates:(UIControlState)additionalStates; 
@end 

@implementation UIButton (AdditionalStates) 

- (void)setTitle:(NSString *)title forState:(UIControlState)state additionalStates:(UIControlState)additionalStates 
{ 
    [self setValue:title forKey:@"title" state:state additionalStates:additionalStates mask:(1 << 0)]; 
} 

- (void)setValue:(id)value forKey:(NSString *)key state:(UIControlState)state additionalStates:(UIControlState)additionalStates mask:(NSUInteger)mask(UIControlState)additionalStates 
{ 
    if (additionalStates == 0) { 
     [self setValue:value forKey:key state:state]; 
     return; 
    } 

    // Iterate over each 'on' bit in additionalStates, starting from the mask bit 
    while (mask > 0) { 
     if (additionalStates & mask) { 
      // Delete the current bit from additionalStates 
      NSUInteger reducedAdditionalStates = (additionalStates^mask); 

      // Set the title for combinations of the remaining additional states with and without the mask bit 
      [self setValue:value forKey:key state:(state | (additionalStates & mask)) additionalStates:reducedAdditionalStates mask:(mask << 1)]; 
      [self setValue:value forKey:key state:state additionalStates:reducedAdditionalStates mask:(mask << 1)]; 
     } 
     mask = (mask << 1); 
    } 
} 

- (void)setValue:(id)value forKey:(NSString *)key state:(UIControlState)state 
{ 
    if ([key isEqualToString:@"title"]) { 
     [self setTitle:value forState:state]; 
     return; 
    } 
} 

@end