如何以编程方式访问视图控制器中的所有标签

时间:2014-07-05 07:54:00

标签: ios objective-c uiviewcontroller uilabel

我不确定这是否可能,但无论如何我都会问。

这是我的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 
}

2 个答案:

答案 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"]];