我有一个UIStepper,它有stepValue of 1。我希望UIStepper能够在其maximum和minimum值之前是正的或负的,但绝不是0。
我为解决这个问题所做的每一次尝试都无法解释步骤是在减少还是在增加(因此应该跳过0到1或-1)。我唯一能想到的另一件事是保存先前的值并进行比较,但这听起来有点牵扯到这样一个简单的任务。
有什么想法吗?还有其他人遇到过同样的要求吗?
发布于 2019-07-03 09:52:17
我会从另一个方向来处理这个问题。让步进者做它所做的,然后改变你对它的解释。
例如,如果您有一个步骤,您想从-5转到+5,但跳过0
minumum设置为-5。maximum设置为4。stepValue设置为1。value时,如果value是非负的,则添加value:
设值= stepper.value + (stepper.value <0 0: 1)value时,首先通过1降低正值:
// 3的值在步进器中由2值=3 stepper.value =值-(值>0 1: 0)表示。使用nonZeroValue 计算属性隐藏详细信息
您可以通过为+1创建一个扩展来隐藏这些-1和nonZeroValue调整,该扩展添加了一个名为nonZeroValue的新计算属性。
extension UIStepper {
var nonZeroValue: Double {
get {
return self.value + (self.value < 0 ? 0 : 1)
}
set {
self.value = newValue - (newValue < 0 ? 0 : 1)
}
}
}然后,只需在代码中使用stepper.nonZeroValue代替stepper.value。
发布于 2019-07-03 08:19:06
用键值观察很容易。它需要步进器的IBOutlet
@IBOutlet var stepper: UIStepper!声明NSKeyValueObservation属性
var observation : NSKeyValueObservation?在viewDidLoad中,观察步骤的value,并在新值为0时对其进行调整。KVO的好处是您可以获得old和new值来检测步长方向。
override func viewDidLoad() {
super.viewDidLoad()
observation = stepper.observe(\.value, options: [.old, .new], changeHandler: { (stepper, change) in
if change.newValue! == 0.0 {
if change.newValue! > change.oldValue! {
stepper.value = 1
} else {
stepper.value = -1
}
}
})
}如果步骤器位于表视图单元格中,则声明单元格中的出口和observation属性,并在控制器的cellForRow中分配观察者。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyGreatCell
let model = datasource[indexPath.row] // just an example
cell.stepper.value = model.stepperValue
...
cell.observation = cell.observe(\.stepper.value, options: [.old, .new], changeHandler: { (stepper, change) in
if change.newValue! == 0.0 {
if change.newValue! > change.oldValue! {
stepper.value = 1
} else {
stepper.value = -1
}
}
model.stepperValue = stepper.value
}
return cell
}并且您必须实现didEndDisplaying来释放观察者
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let tableCell = cell as! MyGreatCell
tableCell.observation = nil
}https://stackoverflow.com/questions/56865070
复制相似问题