UISlider 值更改未触发
Posted
技术标签:
【中文标题】UISlider 值更改未触发【英文标题】:UISlider value changed not firing 【发布时间】:2017-03-25 08:32:37 【问题描述】:我在这样的类中有一个 UISlider 对象:
class SliderObject
// Other properties
@IBOutlet weak var slider: UISlider!
@IBAction func valChange(_ sender: Any)
// Not called
func getView() -> UIView
// Return a UIView with the slider in it - the slider is in a nib
return Bundle.main.loadNibNamed("SliderObjectNib", owner: self, options: nil)?.first as! UIView
// In some other View Controller
var s: SliderObject? // <---- This is the solution.. Keep a strong reference to the variable so it won't get released after `viewDidLoad` returns
func viewDidLoad()
s = SliderObject()
self.view.addSubView(s.getView())
一切都很好。我可以看到我的视图控制器上的滑块并与之交互,但是当我擦洗滑块时,valChange
函数永远不会被调用......有什么想法吗?
【问题讨论】:
请展示 getView 实现 【参考方案1】:你正在从一个类调用一个方法到另一个类。此引用是在局部变量中创建的,当该方法退出时将被释放。它试图在无效对象上调用函数。 使用委托 - 为该方法定义一个协议并让您的视图控制器实现该协议。然后,您可以将视图控制器传递给该方法。
【讨论】:
这实际上是有道理的。我想将滑块逻辑封装在 SliderObject 中。你所说的在我的 VC 中实现委托是有道理的,但是有没有办法解决这个问题? 找到了答案:如果我在我的 VC 中保留对SliderObject
的强烈引用,它就可以工作!感谢您指出了这一点。如果您有更优雅的解决方案,我会全力以赴。【参考方案2】:
添加以下代码:-
// As the slider moves it will continuously call the -valChange:
slider.continuous = true; // false makes it call only once you let go
slider.addTarget(self, action: "valChange:", forControlEvents: .ValueChanged)
【讨论】:
是的也试过了...没有骰子..问题是它根本没有被调用,一旦放手或连续...... 能分享一下getView的实现吗? 已更新 - 我在笔尖中实现了滑块。 您的滑块是视图层次结构中最顶部的元素吗?需要查看您的视图层次结构在 nib 中的位置? 是的,我可以擦洗它。以上是关于UISlider 值更改未触发的主要内容,如果未能解决你的问题,请参考以下文章
在 UISlider 动画时触发 UIControlEventValueChanged?