我不确定这是否可能,但无论如何我都会问。
这是我的ViewController.h
@interface TBL_GameViewController : UIViewController
@property (strong, nonatomic) IBOutlet UILabel *roundText;
@property (strong, nonatomic) IBOutlet UILabel *roundNumber;
@property (strong, nonatomic) IBOutlet UILabel *playerText;
@property (strong, nonatomic) IBOutlet UILabel *playerScore;
@property (strong, nonatomic) IBOutlet UILabel *computerText;
@property (strong, nonatomic) IBOutlet UILabel *computerScore;
@end
这是.m文件中的一种方法
- (void) lablesHiden:(BOOL)on
{
self.roundText.hidden = on;
self.roundNumber.hidden = on;
self.playerText.hidden = on;
self.playerScore.hidden = on;
self.computerText.hidden = on;
self.computerScore.hidden = on;
}
所有这些都是工作文件。
问题
是以某种方式以编程方式访问视图控制器中的所有可用标签?
我之所以这样问的原因是:
我将有大约10种方法需要访问这些标签,以更改各种属性(颜色,文本,...)
如果明天我添加更多标签,我还需要为所有这些方法添加新标签,我想避免这种情况?
更新
我最后使用了这种方法
- (NSArray*) getAllLabels
{
NSArray *labels = [[NSArray alloc] initWithObjects:self.roundText, self.roundNumber, self.playerText, self.playerScore, self.computerText, self.computerScore, nil];
return labels;
}
- (void) appear:(BOOL)on
{
for (UILabel *label in [self getAllLabels]) {
label.alpha = 0.0;
}
// more code
}
答案 0 :(得分:5)
绝对有办法:
for (id label in self.view.subviews) {
if ([label isKindOfClass:[UILabel class]]) {
// do your stuff...
}
}
答案 1 :(得分:3)
使用tag
可以更精细地控制要处理的标签。这比做内省自省更干净。
例如:
#define kPlayer 100
#define kRound 200
#define kComputer 300
#define kText 10
#define kNumber 20
您可以指定代码,例如在viewDidLoad
这样:
roundText.tag = kRound + kText;
现在没有必要遍历所有子视图(每个事务只需要一次迭代)。
for (int x = 100; x < 400; x += 100) {
for (int y = 10; y < 30; y += 10) {
UILabel *label = (UILabel*) [self.view viewWithTag:x+y];
// do something with label
}
}
如果需要,您可以非常方便地排除某些标签。
此外,通过KVC,可以像这样访问所有标签:
[self.view.subviews filteredArrayUsingPredicate:
[NSPredicate predicateWithFormat:@"tag > 99"]];