如何使用KVC更改UIButton的标题?

时间:2012-09-12 13:34:58

标签: objective-c uibutton key-value key-value-coding kvc

我有一组UIButtons,想要将所有标题一次性设置为特定值,不通过数组循环。我发现的唯一解决方案是通过键值编码,即这样的:

[self.board setValue:@"X" forKeyPath:@"titleLabel.text"];

但是,按钮的 titleLabel 属性是只读的,无法更改。我也尝试使用按钮的 title 属性作为键路径,但它也不起作用。

之前我已经通过使用KVC一次性更改所有按钮的“enabled”属性来完成此操作并且效果很好,但是如果我想更改标题它将无法工作(我假设这是因为UIButton的新ControlState特性允许其各种状态的多个标题。)

那么,有没有人有一个单行解决方案(没有循环)来改变数组中每个按钮的标题?

3 个答案:

答案 0 :(得分:1)

实际上,KVC正在工作并正在设置您的文本值。从Apple文档:虽然此属性是只读的,但它自己的属性是可读/写的。使用这些属性配置按钮标签的外观因此textLabel是 UILabel 并且 UILabel 上的 text 属性未被读取只要。它似乎不起作用的原因是您只是更改UILabel的文本而不是标签的帧大小,其默认值为(0,0,0,0)。如果您使用默认值“(三个空白)”初始化按钮(而不是 nil ),那么它将起作用。 (但是,在点击它之后iOS仍然会将按钮值重置为初始值时仍然存在问题)

答案 1 :(得分:0)

如果你对子类化没问题,你可以使你的按钮符合KVC标题属性。为了您的目的,实现-set<Key>:方法就足够了,但是在Swift中,您可以通过定义一个计算属性来实现-<key>-set<Key>:

class KVCButton: UIButton {

    var titleForNormalState: String? {
        get {
            return titleForState(.Normal)
        }
        set {
            setTitle(newValue, forState: .Normal)
        }
    }
}

然后拨打[self.board setValue:@"X" forKeyPath:@"titleForNormalState"];

您可以找到有关确保KVC合规性的更多信息here

答案 2 :(得分:0)

我知道这是一个老问题,但我使用一个解决方案为IBOutletCollection(UIButton)设置textColor;它类似于将文本设置为按钮;

正如John Dalton所说,按钮属性是只读的,因此无法使用KVC;但是,如果您按类别为UIButton定义新属性,然后通过KVC添加文本(在我的案例中为文本颜色),则可能;

添加新文件 - &gt;选择Objective-c File

姓名:财产(这是您的选择)

文件类型:类别

类:UIButton

将创建名为 UIButton + Property.h / .m 的两个文件

·H

@interface UIButton (Property)

@property (nonatomic, retain) UIColor *textColor;

- (void)setTextColor:(UIColor *)textColor;
@end

的.m

#import "UIButton+Property.h"

@implementation UIButton (Property)


- (void)setTextColor:(UIColor *)textColor {
    [self setTitleColor:textColor forState:UIControlStateNormal];
}

- (UIColor *)textColor {
    return self.textColor;
}
@end

课堂上:

@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *preLoginLbls;

。 。

[_preLoginBtns setValue:TEXT_COLOR forKey:@"textColor"];