使用单个方法调用设置UIButton的标题?
我想通过代码设置UIButton的标题。我发现自己必须为UIControlStateNormal,UIControlStateHighlighted,UIControlStateDisabled和UIControlStateSelected调用 - [UIButton setTitle:forState:]。而这甚至不考虑这些国家的所有组合。使用单个方法调用设置UIButton的标题?
不用说,这是令人厌烦的。是否有一个我可以做的调用,将设置一个字符串作为所有状态的标题? (因为,我假设在95%的情况下,这是所需的行为?)
是的,你当然可以。 From the docs:
在一般情况下,如果一个属性是不是一个国家规定 ,默认是 使用
UIControlStateNormal
值。 如果未设置UIControlStateNormal
的值,则属性将默认为 为系统值。因此,至少在 处,应该将 的值设置为正常状态。
所以,只需设置标题UIControlStateNormal
,你就是金。
像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
这样的掩码表示控件同时高亮显示和禁用的状态。我错误地认为该掩码表示“高亮或已禁用”。总而言之,你最好用青蛙先生的回答。
我发现这不适合我。文字没有显示在按钮上。我想知道是否因为UIControlStateNormal等于0,使它在掩码中相当无用? – 2010-04-14 21:22:13
Mr. Frog :) 15chars – 2010-04-14 23:18:45
@George:你说得对。看起来我的回答不正确。我会添加一个注释。 – Tom 2010-04-14 23:59:58
为UIButton创建一个类别方法,一次为所有状态设置它。
虽然回落到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
在实践中,我发现情况似乎并非如此:文本神秘地消失,当一个按钮被点击等。这就是说,我不知道我可以重新创建这些情况。如果我发现问题,我会在这里发布。谢谢! – 2010-03-19 18:09:09