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?

根据 UISlider 值更改 UILabel 的案例语句

在 Swift 中使用 UISlider 以编程方式更改 UILabel

根据 UISlider 的值更改 NSTime

UISlider 的上次值和当前更改值

使用 minimumImageValue / maximumImageValue 更改 UISlider 值