【问题标题】:Creating duplicate outlets/actions on Xcode在 Xcode 上创建重复的 outlet/action
【发布时间】:2017-10-08 17:40:59
【问题描述】:

我目前在我的viewcontroller.swift 上有三个单独的滑块,我希望它们都执行相同的功能,即将滑块值四舍五入到最近的位置。我已经完成了第一个,比如:

@IBAction func changePos(_ sender: UISlider) {
    slider.value = roundf(slider.value)
}

我尝试了许多不同的方法来使用slider2, changePos2, etc 将相同的功能添加到不同的 UISlider,但我的应用程序要么崩溃,要么不执行该功能。

如何让不同的 UISlider 在同一个视图控制器中执行相同的功能?

【问题讨论】:

  • 崩溃说什么?
  • 将您的func 更改为使用sender 而不是slider,然后将所有滑块连接到这个@IBAction。 @IBAction func changePos(_ sender: UISlider) { sender.value = roundf(sender.value)}
  • 好的,我刚刚将所有滑块变量设置为sender,一切正常。所以对于我的另外两个,我不必制作新的 IBOutlet 或 IBAction?我可以简单地在现有的 IBAction 中放置一个新的函数吗?
  • 问题解决了,我参考了你关于更改为发件人的建议,还实现了changePos1, changePos2, changePos3,它们都有效。
  • @jacobbullon 这根本不是正确的解决方案,也不是 vacawama 建议的。您只需要一个changePos 方法。在其中,只需将slider 的两个引用更改为sender。然后将所有滑块连接到那个 IBAction。

标签: ios swift xcode uislider ibaction


【解决方案1】:

您可以将所有 3 个滑块连接到同一个 @IBAction。只需在实现中使用sender 参数而不是slider 输出即可。

@IBAction func changePos(_ sender: UISlider) {
    sender.value = sender.value.rounded()
}

【讨论】:

    【解决方案2】:

    做到这一点的好方法是使用如下所示的 IBOutletCollections。

    @IBOutlet var sliders: [UISlider]!
    

    然后在下面使用漂亮的快速语法:

    sliders.forEach { (slider) in
                slider.addTarget(self, action: #selector(sliderValueDidChange(sender:)), for: .valueChanged)
            }
    

    这样,您将为每个滑块调用相同的选择器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      相关资源
      最近更新 更多