2015-06-04 2 views
1

В моем приложении у меня есть три UIButton, каждый из которых связан с UIView. Когда одна из кнопок нажата, я хочу:Самый чистый способ получить связанный UIView от обработчика пресса UIButton

  1. Выделите нажимается кнопка
  2. Un-выделить другие кнопки
  3. скрыть UIViews, связанные с другими кнопками
  4. Un-скрыть UIView связанные с нажатой кнопкой

Мое решение (ниже) работает и не ужасно, но я не могу не думать, что есть более чистый и эффективный способ. Какие-либо предложения?

-(IBAction)buttonPressed:(id)sender { 

    NSArray *buttonArray = [NSArray arrayWithObjects:button1, button2, button3, nil]; 

    NSDictionary* buttonViewDict = @{button1.titleLabel.text : view1, 
            button2.titleLabel.text : view2, 
            button3.titleLabel.text : view3}; 

    for (UIButton* button in buttonArray) { 
     [button setHighlighted:[button isEqual:sender]]; 
     [((UIView*)[buttonViewDict objectForKey:button.titleLabel.text]) setHidden:![button isEqual:sender]]; 
    } 
} 
+0

Я хотел бы сделать это так же, как, как вы сделали. –

+0

Я бы сделал то же самое, хотя, если кнопки и представления не являются динамическими, я бы рассмотрел возможность определения массива и словаря только один раз :) – brechtb

+0

Вы можете использовать кнопки в коллекции. Также почему вам нужно buttonViewDict, когда вы можете использовать свойство кнопки? :) – sunshinejr

ответ

1

Вы можете использовать свойство tag, чтобы идентифицировать ваши кнопки и свои представления.

Настройка значений тегов в Interface Builder или в -viewDidLoad, а затем использовать значение тега, чтобы определить, какая кнопка была нажата:

- (IBAction)buttonPressed:(UIButton*)sender { 
    for (UIButton* button in _buttons) { 
     button.highlighted = button.tag == sender.tag; 
    } 
    for (UIView* view in _views) { 
     view.hidden = view.tag != sender.tag; 
    } 
} 
1

Для чего это стоит, мне нравится ваш путь. Я хотел бы рассмотреть с помощью кнопок в качестве ключей и упрощения его, как так -

NSDictionary *buttonViewDict = @{button1 : view1, 
           button2 : view2, 
           button3 : view3}; 

[buttonViewDict enumerateKeysAndObjectsUsingBlock:^(UIButton *button, UIView *view, BOOL *stop) { 
    view.hidden = !button.highlighted = sender == button; 
}]; 

Вы также можете хранить словарь как свойство.

+0

Мне очень нравится этот ответ. Не знал о методе enumerateKeysAndObjectsUsingBlock. К сожалению, UIButtons нельзя использовать в качестве словарных клавиш, поскольку они не соответствуют NSCopying. – JordanC

+0

Ах да, это позор. – johnpatrickmorgan

Смежные вопросы