从 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 的最简洁方法的主要内容,如果未能解决你的问题,请参考以下文章
在自定义 UITableViewCell 中按下 UIButton 时如何获取 indexPathForSelectedRow