在 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的主要内容,如果未能解决你的问题,请参考以下文章
设备和模拟器中iPhone应用程序上的Xcode链接器错误[重复]