防止 UIStepper 为 0?
Prevent UIStepper from being 0?
我有一个 UIStepper
,其中 stepValue
为 1
。我希望 UIStepper
在其 maximum
和 minimum
值之前能够为正或负,但永远不会 0
。
我为解决这个问题所做的每一次尝试都无法解释步进器是在减少还是在增加(因此应该跳过 0
到 1
或 -1
)。我唯一能想到的另一件事是保存以前的值并进行比较,但是对于这样一个简单的任务来说这听起来有点复杂。
有什么想法吗?还有其他人 运行 符合相同的要求吗?
Key-Value 观察非常容易。它需要一个 IBOutlet
的步进器
@IBOutlet var stepper: UIStepper!
声明一个 NSKeyValueObservation
属性
var observation : NSKeyValueObservation?
在viewDidLoad
观察stepper的value
如果new值为0则调整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
}
}
})
}
如果步进器位于 table 视图单元格中,则声明单元格中的出口和 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
}
我会从不同的方向来处理这个问题。让步进器做它做的,只是改变你对它的解释。
例如,如果您有一个步进器,您想要从 -5
转到 +5
但跳过 0
:
- 将步进器
minumum
设置为 -5
。
- 将步进器
maximum
设置为 4
。
- 将步进器
stepValue
设置为 1
。
当你阅读步进器value
时,添加1
如果value
是non-negative:
let value = stepper.value + (stepper.value < 0 ? 0 : 1)
设置步进器value
时,首先将正值降低1
:
// value of 3 will be represented in the stepper by 2
value = 3
stepper.value = value - (value > 0 ? 1 : 0)
用 nonZeroValue
计算隐藏细节 属性
您可以隐藏这些 +1
和 -1
调整,方法是创建 UIStepper
的扩展,添加一个名为 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
。
我有一个 UIStepper
,其中 stepValue
为 1
。我希望 UIStepper
在其 maximum
和 minimum
值之前能够为正或负,但永远不会 0
。
我为解决这个问题所做的每一次尝试都无法解释步进器是在减少还是在增加(因此应该跳过 0
到 1
或 -1
)。我唯一能想到的另一件事是保存以前的值并进行比较,但是对于这样一个简单的任务来说这听起来有点复杂。
有什么想法吗?还有其他人 运行 符合相同的要求吗?
Key-Value 观察非常容易。它需要一个 IBOutlet
的步进器
@IBOutlet var stepper: UIStepper!
声明一个 NSKeyValueObservation
属性
var observation : NSKeyValueObservation?
在viewDidLoad
观察stepper的value
如果new值为0则调整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
}
}
})
}
如果步进器位于 table 视图单元格中,则声明单元格中的出口和 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
}
我会从不同的方向来处理这个问题。让步进器做它做的,只是改变你对它的解释。
例如,如果您有一个步进器,您想要从 -5
转到 +5
但跳过 0
:
- 将步进器
minumum
设置为-5
。 - 将步进器
maximum
设置为4
。 - 将步进器
stepValue
设置为1
。 当你阅读步进器
value
时,添加1
如果value
是non-negative:let value = stepper.value + (stepper.value < 0 ? 0 : 1)
设置步进器
value
时,首先将正值降低1
:// value of 3 will be represented in the stepper by 2 value = 3 stepper.value = value - (value > 0 ? 1 : 0)
用 nonZeroValue
计算隐藏细节 属性
您可以隐藏这些 +1
和 -1
调整,方法是创建 UIStepper
的扩展,添加一个名为 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
。