【问题标题】:Define click event for UISegmentedControl为 UISegmentedControl 定义点击事件
【发布时间】:2011-03-04 05:06:10
【问题描述】:

我在我的应用程序中添加了UISegmentedControl。在正常状态下没有选择任何按钮。我想在选择第一个段时实现一个按钮单击事件,并在单击另一个按钮时实现另一个事件。

【问题讨论】:

  • 如何在 UISegmented Control 中设置普通段。谢谢。
  • @Pugal devan 设置段控件样式属性segmentedControl.segmentedControlStyle = UISegmentedControlStyleBordered;

标签: ios cocoa-touch uisegmentedcontrol


【解决方案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];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-02-18
            • 2018-05-09
            • 2015-08-09
            • 1970-01-01
            • 2013-09-08
            • 2019-11-09
            • 1970-01-01
            • 2017-01-28
            相关资源
            最近更新 更多