1

我有一个 UIButtons 数组,并且想一次将它们的所有标题设置为特定值,而不是遍历数组。我发现的唯一解决方案是通过键值编码,即这样的:

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

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

我之前通过使用 KVC 一次更改所有按钮的“启用”属性来完成此操作,效果很好,但是如果我想更改标题,它就不起作用(我假设这是因为UIButton 的新 ControlState 功能,允许为其各种状态提供多个标题)。

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

4

3 回答 3

1

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

于 2012-09-12T15:34:37.620 回答
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 合规性的更多信息。

于 2015-05-07T15:50:43.463 回答
0

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

正如 John Dalton 提到的,按钮属性是只读的,因此无法使用 KVC;但是如果您按类别为 UIButton 定义一个新属性,然后通过 KVC 添加文本(在我的情况下为文本颜色),这是可能的;

添加新文件-> 选择 Objective-c 文件

名称:物业(由您选择)

文件类型:类别

类: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"];
于 2017-10-21T12:17:46.953 回答