Swift处理分段控件上的操作

48

我有一个带有4个分段的HMSegmentedControl。 当选择时,它应该弹出视图。当关闭弹出视图并尝试单击相同的段索引时,它应再次显示弹出视图。 使用以下内容在弹出视图关闭后单击相同的段索引没有任何操作。

segmetedControl.addTarget(self, action: "segmentedControlValueChanged:", forControlEvents: UIControlEvents.ValueChanged) 

请考虑使用以下方法代替:https://dev59.com/73I-5IYBdhLWcg3w487k - Gerald
7个回答

63
你可以为多个事件添加相同的目标。
因此,假设你的 segmentedControlValueChanged: 如下所示:
@objc func segmentedControlValueChanged(_ sender: UISegmentedControl) {
    if sender.selectedSegmentIndex == 0 {
        // value for first index selected here
    }
}

然后您可以为多个事件添加目标,以调用此函数:

segmentedControl.addTarget(self, action: #selector(segmentedControlValueChanged(_:)), for: .valueChanged)
segmentedControl.addTarget(self, action: #selector(segmentedControlValueChanged(_:)), for: .touchUpInside)

现在你的函数将在值改变且用户松开手指时被调用。


似乎这在Xcode 14上无法工作。 - RawMean

20

使用“sender”作为发件人,在动作中访问时,请使用发件人姓名“sender”:

segmentControl.addTarget(self, action: #selector(changeWebView(sender:)), for: .valueChanged)
或者
addTarget(self, action: #selector(changeWebView), for: .valueChanged)

19

Swift 5

// 添加视图控制器

@IBOutlet var segmentedControl: UISegmentedControl!

override func viewDidLoad() {
    super.viewDidLoad()
    segmentedControl.addTarget(self, action: #selector(CommentsViewController.indexChanged(_:)), for: .valueChanged)
}

//使用change

@objc func indexChanged(_ sender: UISegmentedControl) {
    if segmentedControl.selectedSegmentIndex == 0 {
        print("Select 0")
    } else if segmentedControl.selectedSegmentIndex == 1 {
        print("Select 1")
    } else if segmentedControl.selectedSegmentIndex == 2 {
        print("Select 2")
    }
}

15

您将目标设置为在值更改时触发,因此如果选择同一段,则值不会更改,弹出窗口不会显示,请尝试将事件更改为TouchUpInside,这样每次您触摸该段时都会触发

segmentedControl.addTarget(self, action: #selector(segmentedControlValueChanged(_:)), for: .touchUpInside)

7
我已经尝试使用TouchUpInside事件了,但它没有起作用。使用它时不会触发任何事件。 - TechSavy
2
你也尝试过 .AllEvents 了吗? - Icaro
很好,我很高兴能够帮助。 - Icaro
1
我尝试了.TouchUpInside.AllEvents,但它们都不起作用。请查看此链接:https://dev59.com/73I-5IYBdhLWcg3w487k。我不知道为什么原帖的作者接受了这个答案。 - Gerald
10
.valueChanged事件适用于UISegmentControl。 - ranjit.x.singh
显示剩余2条评论

4
@IBAction func segmentedControlButtonClickAction(_ sender: UISegmentedControl) {
   if sender.selectedSegmentIndex == 0 {
      print("First Segment Select")
   }
   else { 
      print("Second Segment Select")
   }
}

2

Swift4 语法:

segmentedControl.addTarget(self, action: "segmentedControlValueChanged:", for:.touchUpInside)

0

拖放创建一个值类型的动作。

enter image description here

@IBAction func actionSegment(_ sender: Any) {
    let segemnt = sender as! UISegmentedControl
    print(segemnt.selectedSegmentIndex)// 0 , 1

}

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