Да ... это сложнее, чем вы думаете. Я рекомендую радар на bugreporter.apple.com.
В моем коде я иногда прибегаю к тому, чтобы делать это в таком коде. Это экономит много времени, хлопот и ошибок, когда я решаю изменить шрифт для всех кнопок, цвет фона или что-то еще. Это дает преимущества макета IB с согласованностью кода.
// We have a lot of buttons that point to the same thing. It's a pain to wire
// them all in IB. Just find them all and write them up
- (void)wireButtons
{
for (UIView *view in [self.view subviews])
{
if ([view isKindOfClass:[UIButton class]])
{
UIButton *button = (UIButton *)view;
[button setTitle:[self buttonTitleForTag:button.tag] forState:UIControlStateNormal];
button.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
button.titleLabel.textAlignment = UITextAlignmentCenter;
if (![button actionsForTarget:self forControlEvent:UIControlEventTouchUpInside])
{
[button addTarget:self action:@selector(performSomething:) forControlEvents:UIControlEventTouchUpInside];
}
}
}
}
Я использую подобную технику, когда мне нужно рекурсивно собрать все элементы управления (я использую это для представлений сквозного сквозного просмотра, но это также полезно для массового отключения):
- (NSArray *)controlViewsForView:(UIView *)aView
{
if (!aView)
{
return nil;
}
NSMutableArray *controlViews = [NSMutableArray new];
for (UIView *subview in aView.subviews)
{
if ([subview isKindOfClass:[UIControl class]] && ! [self viewIsEffectivelyHidden:subview])
{
[controlViews addObject:subview];
}
[controlViews addObjectsFromArray:[self controlViewsForView:subview]];
}
return controlViews;
}
- (BOOL)viewIsEffectivelyHidden:(UIView *)view
{
if (! view)
{
return NO;
}
if ([view isHidden])
{
return YES;
}
return [self viewIsEffectivelyHidden:[view superview]];
}