在 Xcode 上创建重复的 outlet/action

Posted

技术标签:

【中文标题】在 Xcode 上创建重复的 outlet/action【英文标题】:Creating duplicate outlets/actions on Xcode 【发布时间】: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。 【参考方案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)
        

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

【讨论】:

以上是关于在 Xcode 上创建重复的 outlet/action的主要内容,如果未能解决你的问题,请参考以下文章

Xcode代码符号错误[重复]

设备和模拟器中iPhone应用程序上的Xcode链接器错误[重复]

在 Xcode 模拟器上运行预览 [重复]

模拟器在不同的xcode版本上产生不同的结果[重复]

Xcode:模拟器显示正确的xib界面,但在设备上,它显示旧界面[重复]

自Xcode 10以来,UIImageView setImage在后台线程上崩溃[重复]