为 UISegmentedControl 定义点击事件
Posted
技术标签:
【中文标题】为 UISegmentedControl 定义点击事件【英文标题】:Define click event for UISegmentedControl 【发布时间】:2011-03-04 05:06:10 【问题描述】:我在我的应用程序中添加了UISegmentedControl
。在正常状态下没有选择任何按钮。我想在选择第一个段时实现一个按钮单击事件,并在单击另一个按钮时实现另一个事件。
【问题讨论】:
如何在 UISegmented Control 中设置普通段。谢谢。 @Pugal devan 设置段控件样式属性segmentedControl.segmentedControlStyle = UISegmentedControlStyleBordered; 【参考方案1】:如果我正确理解您的问题,您只需为常量UIControlEventValueChanged
实现一个目标操作方法(由UIControl
支持,这是UISegmentedControl
的父类),就像在给出的示例中一样UISegmentControl 的reference documentation。
即
[segmentedControl addTarget:self
action:@selector(action:)
forControlEvents:UIControlEventValueChanged];
用于具有以下签名的消息:
- (void)action:(id)sender
或
[segmentedControl addTarget:self
action:@selector(action:forEvent:)
forControlEvents:UIControlEventValueChanged];
为
- (void)action:(id)sender forEvent:(UIEvent *)event
或
[segmentedControl addTarget:self
action:@selector(action)
forControlEvents:UIControlEventValueChanged];
最简单的方法:
- (void)action
这是 UIKit 中使用的标准类型的目标操作选择器。
【讨论】:
请注意:我相信如果您将方法定义为 -(void)action 那么您会希望选择器为 @selector(action) 否则它将崩溃。 选择器必须与消息完全匹配,但没有参数,所以@selector(action:forEvent:) 是"- (void)action:(id)sender forEvent:(UIEvent *) 的选择器事件” 我有一个问题,即使我手动更改所选索引,也会调用此操作吗?如果我不希望这种情况发生,我可以听其他一些控制事件吗? 您现在肯定已经明白了,但是不,目标不会收到使用代码应用更改的通知。仅通过用户的操作。【参考方案2】:试试这个:
- (IBAction)segmentSwitch:(UISegmentedControl *)sender
NSInteger selectedSegment = sender.selectedSegmentIndex;
if (selectedSegment == 0)
else
【讨论】:
【参考方案3】:简单版快速更新
func loadControl()
self.yourSegmentedControl.addTarget(self, action: #selector(segmentSelected(sender:)), forControlEvents: .valueChanged)
func segmentSelected(sender: UISegmentedControl)
let index = sender.selectedSegmentIndex
// Do what you want
【讨论】:
最新的 swift 语法:self.segmentedControl.addTarget(self, action: #selector(segmentSelected(sender:)), for: .valueChanged)【参考方案4】:试试这个,
UISegmentedControl * travelModeSegment = [[UISegmentedControl alloc] initWithItems:
[NSArray arrayWithObjects:NSLocalizedString(@"Driving", nil), NSLocalizedString(@"Walking", nil), nil]];
[travelModeSegment setFrame:CGRectMake(9.0f, 0.0f, 302.0f, 45.0f)];
[cell addSubview:travelModeSegment];
[travelModeSegment release];
然后写一个动作,
if (travelModeSegment.selectedSegmentIndex == 0)
//write here your action when first item selected
else
//write here your action when second item selected
希望对你有帮助
【讨论】:
【参考方案5】:值得注意的是,选择器必须完全匹配一个方法,但没有实际参数。
@selector(action)
=> -(void) action ..code..
@selector(action:)
=> -(void) action:(id)sender ..code..
@selector(action:forEvent:)
=> -(void) action:(id)sender forEvent:(UIEvent *)event ..code..
这让我困惑了很长时间,从之前的答案中并不太清楚。
【讨论】:
非常感谢您做出解释,乔纳森。这是我需要为自己澄清的事情之一...... 呃......'现在相当一段时间';-)'也很好地呈现;它直接在我的代码库中! :-)【参考方案6】:对于 SWIFT,请使用:
segmentedControl.addTarget( self, action: "segmentSelected:", forControlEvents: UIControlEvents.ValueChanged )
并实现这样的方法:
func segmentSelected(sender: UISegmentedControl)
println("selected index: \(sender.selectedSegmentIndex)")
如果您想在选定段被选中时调用特定操作,请扩展 UISegmentedControl:
class CustomSegmentedControl : UISegmentedControl
override init()
super.init()
override init(frame:CGRect)
super.init(frame:frame)
required init(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
func valueChanged(index:Int)
// ACTION GOES HERE
并像这样在“segmentSelected”中调用您的“valueChanged”:
func segmentSelected(sender: CustomSegmentedControl)
println("selected index: \(sender.selectedSegmentIndex)")
sender.valueChanged(sender.selectedSegmentIndex)
【讨论】:
【参考方案7】:就这么简单,您需要使用情节提要对视图控制器进行操作才能使该操作起作用。
- (IBAction)searchSegmentedControl:(UISegmentedControl *)sender
switch (sender.selectedSegmentIndex)
case 0:
NSLog(@"First was selected");
break;
case 1:
NSLog(@"Second was selected");
break;
case 2:
NSLog(@"Third was selected");
break;
default:
break;
【讨论】:
【参考方案8】:您可以将 IB 中的处理程序附加到值更改事件:UIControlEventValueChanged
或者你可以在代码中做到这一点:
[segmentedControl addTarget:self
action:@selector(action:)
forControlEvents:UIControlEventValueChanged];
【讨论】:
以上是关于为 UISegmentedControl 定义点击事件的主要内容,如果未能解决你的问题,请参考以下文章
在 UISegmentedControl 上记录点击在测试期间断言失败