为UISegmentedControl定义单击事件

War*_*ior 62 cocoa-touch uisegmentedcontrol ios

UISegmentedControl在我的申请中添加了一个.在正常状态下没有选择任何按钮.我想在选择第一个段时实现按钮单击事件,而在单击另一个按钮时实现另一个事件.

mac*_*die 129

如果我正确理解你的问题,你只需要为常量实现一个目标动作方法(由UIControl哪个是UISegmentedControl父类支持)UIControlEventValueChanged,就像在UISegmentControl的参考文档中给出的例子一样.

[segmentedControl addTarget:self
                     action:@selector(action:)
           forControlEvents:UIControlEventValueChanged];
Run Code Online (Sandbox Code Playgroud)

用于具有以下签名的邮件:

- (void)action:(id)sender
Run Code Online (Sandbox Code Playgroud)

要么

[segmentedControl addTarget:self
                     action:@selector(action:forEvent:)
           forControlEvents:UIControlEventValueChanged];
Run Code Online (Sandbox Code Playgroud)

对于

- (void)action:(id)sender forEvent:(UIEvent *)event
Run Code Online (Sandbox Code Playgroud)

要么

[segmentedControl addTarget:self
                     action:@selector(action)
           forControlEvents:UIControlEventValueChanged];
Run Code Online (Sandbox Code Playgroud)

对于最简单的方法:

- (void)action
Run Code Online (Sandbox Code Playgroud)

这是UIKit中使用的标准类型的目标动作选择器.

  • 快速抬头:我相信如果你将方法定义为 - (void)action,那么你会希望选择器是@selector(action),否则它会崩溃. (5认同)

Nun*_*rro 65

试试这个:

- (IBAction)segmentSwitch:(UISegmentedControl *)sender {
      NSInteger selectedSegment = sender.selectedSegmentIndex;

      if (selectedSegment == 0) {

      }
      else{

      }
    }
Run Code Online (Sandbox Code Playgroud)


Siv*_*han 9

试试这个,

    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];
Run Code Online (Sandbox Code Playgroud)

然后写一个动作,

     if (travelModeSegment.selectedSegmentIndex == 0) {
        //write here your action when first item selected
    } else {
        //write here your action when second item selected
    }
Run Code Online (Sandbox Code Playgroud)

我希望它会对你有所帮助


Ben*_*o85 9

swift更新的简单版本

func loadControl(){
     self.yourSegmentedControl.addTarget(self, action: #selector(segmentSelected(sender:)), forControlEvents: .valueChanged)
}

func segmentSelected(sender: UISegmentedControl)
{
    let index = sender.selectedSegmentIndex

    // Do what you want
}
Run Code Online (Sandbox Code Playgroud)

  • 最新的swift语法:self.segmentedControl.addTarget(self,action:#selector(segmentSelected(sender :)),用于:.valueChanged) (2认同)

Jon*_*han 7

值得注意的是,选择器必须完全匹配方法,但没有实际参数.

@selector(action)
    => -(void) action { ..code.. }

@selector(action:) 
    => -(void) action:(id)sender { ..code.. }

@selector(action:forEvent:) 
    => -(void) action:(id)sender forEvent:(UIEvent *)event { ..code.. }
Run Code Online (Sandbox Code Playgroud)

这使我困惑的时间最长,而且从早期的答案来看并不十分清楚.


dat*_*eah 6

对于SWIFT使用此:

segmentedControl.addTarget( self, action: "segmentSelected:", forControlEvents: UIControlEvents.ValueChanged )
Run Code Online (Sandbox Code Playgroud)

并实现这样的方法:

func segmentSelected(sender: UISegmentedControl)
{
    println("selected index: \(sender.selectedSegmentIndex)")
}
Run Code Online (Sandbox Code Playgroud)

如果要在选择所选段时调用特定操作,请扩展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
    }      
}
Run Code Online (Sandbox Code Playgroud)

并在"segmentSelected"中调用您的"valueChanged",如下所示:

func segmentSelected(sender: CustomSegmentedControl)
{
    println("selected index: \(sender.selectedSegmentIndex)")
    sender.valueChanged(sender.selectedSegmentIndex)
}
Run Code Online (Sandbox Code Playgroud)