我有一组UIButtons,想要将所有标题一次性设置为特定值,不通过数组循环。我发现的唯一解决方案是通过键值编码,即这样的:
[self.board setValue:@"X" forKeyPath:@"titleLabel.text"];
但是,按钮的 titleLabel 属性是只读的,无法更改。我也尝试使用按钮的 title 属性作为键路径,但它也不起作用。
之前我已经通过使用KVC一次性更改所有按钮的“enabled”属性来完成此操作并且效果很好,但是如果我想更改标题它将无法工作(我假设这是因为UIButton的新ControlState特性允许其各种状态的多个标题。)
那么,有没有人有一个单行解决方案(没有循环)来改变数组中每个按钮的标题?
答案 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"];