从 UIButton 按下处理程序获取关联 UIView 的最简洁方法

Posted

技术标签:

【中文标题】从 UIButton 按下处理程序获取关联 UIView 的最简洁方法【英文标题】:Cleanest way to get associated UIView from UIButton press handler 【发布时间】:2015-06-04 20:02:44 【问题描述】:

在我的应用程序中,我有三个 UIButton,每个都有一个关联的 UIView。当按下其中一个按钮时,我想:

    突出显示按下的按钮 取消突出显示其他按钮 隐藏与其他按钮关联的 UIViews 取消隐藏与按下的按钮关联的 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]];
    

【问题讨论】:

我会像你那样做。 我会这样做,但如果按钮和视图不是动态的,我会考虑只定义一次数组和字典 :) 您可以使用 outlet 集合中的按钮。当您可以使用按钮的属性时,为什么还需要 buttonViewDict? :) 【参考方案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;
    

【讨论】:

【参考方案2】:

不管怎样,我喜欢你的方式。我会考虑将按钮用作键并像这样简化它-

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

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

您可能还希望将字典存储为属性。

【讨论】:

我真的很喜欢这个答案。不知道 enumerateKeysAndObjectsUsingBlock 方法。不幸的是,UIButtons 不能用作字典键,因为它们不符合 NSCopying。 啊,是的,太可惜了。

以上是关于从 UIButton 按下处理程序获取关联 UIView 的最简洁方法的主要内容,如果未能解决你的问题,请参考以下文章

获取 UIButton 按下的内容

如何通过让子视图 UIButton 获取新闻事件?

检测按下了哪个按钮? (然后行动)

按下时如何获取 UIButton 的标题

在自定义 UITableViewCell 中按下 UIButton 时如何获取 indexPathForSelectedRow

多个uibutton在目标c中执行相同的功能