为 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 样式

在 UISegmentedControl 上记录点击在测试期间断言失败

UISegmentedControl 寄存器点击选定的段

UISegmentedControl 自定义/扩展

错误:点击 UISegmentedControl 时将无法识别的选择器发送到实例

RadioGroup实现类似ios的分段选择(UISegmentedControl)控件