IBOutletCollection - подключение нескольких объектов одновременно - PullRequest
3 голосов
/ 16 февраля 2012

Я использовал IBOutletCollections, чтобы применить то же поведение ко многим объектам, которые подключены в IB. Это значительно экономит время, но все же требуется много времени для индивидуального установления соединения между каждым объектом в IB и IBOutletCollection, объявленным в моем заголовочном файле.

Я попытался выделить несколько объектов интерфейса в IB и перетащить соединение в IBOutletCollection, но даже при этом он все еще только подключает их по одному. Есть ли скрытый способ соединить много одновременно?

Спасибо

1 Ответ

2 голосов
/ 16 февраля 2012

Да ... это сложнее, чем вы думаете. Я рекомендую радар на 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]];
}
...