为 UISegmentedControl 定义点击事件

67

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


如何在UISegmented Control中设置普通分段。谢谢。 - Pugalmuni
@Pugal devan 设置分段控件样式属性segmentedControl.segmentedControlStyle = UISegmentedControlStyleBordered; - Warrior
8个回答

132
如果我正确理解了您的问题,您只需实现一个目标-动作方法(由UIControl支持,它是UISegmentedControl的父类)来处理常量UIControlEventValueChanged,就像在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中使用的标准目标-动作选择器类型。

5
简要提醒:我认为如果你将方法定义为-(void)action,那么你需要将选择器设为@selector(action),否则它会崩溃。 - Philippe Sabourin
1
选择器必须完全匹配消息,但不包括参数,因此@selector(action:forEvent:)是“- (void)action:(id)sender forEvent:(UIEvent *)event”的选择器。 - Jonathan
我有一个问题,即使我手动更改了所选索引,这个操作是否仍会被调用?如果我不想发生这种情况,我能否监听其他控件事件? - JohnVanDijk
你肯定已经明白了,但是不,目标不会在使用代码应用更改时被通知。只有通过用户的操作才能实现。 - macbirdie

69

试试这个:

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

      if (selectedSegment == 0) {

      }
      else{

      }
    }

12

更新了 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
}

4
最新的Swift语法:self.segmentedControl.addTarget(self, action: #selector(segmentSelected(sender:)), for: .valueChanged)翻译:最新的Swift语法:将self.segmentedControl添加事件监听,当值改变时触发#selector(segmentSelected(sender:))方法。 - Gilles

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];

然后编写一个操作:
     if (travelModeSegment.selectedSegmentIndex == 0) {
        //write here your action when first item selected
    } else {
        //write here your action when second item selected
    }

我希望它能对你有所帮助


7
值得注意的是,选择器必须完全匹配一个方法,但不包括实际参数。
@selector(action)
    => -(void) action { ..code.. }

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

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

这个问题曾经让我困惑了很长时间,而且从之前的回答中也并不太清楚。


1
非常感谢你的解释,Jonathan。这是我需要澄清自己的事情之一,已经有相当长的时间了。演示也很好,它已经直接进入我的代码库了! :-) - Slowburner

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”:

请注意,不要删除html标签。

func segmentSelected(sender: CustomSegmentedControl)
{
    println("selected index: \(sender.selectedSegmentIndex)")
    sender.valueChanged(sender.selectedSegmentIndex)
}

4

简单来说,你需要使用故事板将动作连接到视图控制器,以使这个动作能够正常工作。

- (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;
    }
}

2

您可以在IB中将处理程序附加到值更改事件:UIControlEventValueChanged

或者您可以在代码中执行:

[segmentedControl addTarget:self
                     action:@selector(action:)
           forControlEvents:UIControlEventValueChanged];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接