我有一个UIStepper
,其中stepValue
为1
。我希望UIStepper
在它的maximum
和minimum
值之前能够为正或负,但永远不要为0
。
我为解决此问题所做的每一次尝试都无法说明步进器是减小还是增大(因此应将0
跳到1
或跳到-1
)。我唯一能想到的就是保存先前的值并进行比较,但这听起来像是涉及到这么简单的任务。
有什么想法吗?还有其他人遇到过同样的要求吗?
答案 0 :(得分:1)
键值观察非常容易。它需要07-03 09:49:18.477: E/Fitness(19288): Error reading goals.
07-03 09:49:18.477: E/Fitness(19288): java.lang.IllegalStateException: Create time should be specified.
07-03 09:49:18.477: E/Fitness(19288): at rxp.a(:com.google.android.gms@17785037@17.7.85 (100400-253824076):13)
07-03 09:49:18.477: E/Fitness(19288): at zre.a(:com.google.android.gms@17785037@17.7.85 (100400-253824076):69)
07-03 09:49:18.477: E/Fitness(19288): at yus.handleMessage(:com.google.android.gms@17785037@17.7.85 (100400-253824076):1)
07-03 09:49:18.477: E/Fitness(19288): at skd.run(:com.google.android.gms@17785037@17.7.85 (100400-253824076):8)
07-03 09:49:18.477: E/Fitness(19288): at skq.b(:com.google.android.gms@17785037@17.7.85 (100400-253824076):37)
07-03 09:49:18.477: E/Fitness(19288): at skq.run(:com.google.android.gms@17785037@17.7.85 (100400-253824076):21)
07-03 09:49:18.477: E/Fitness(19288): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
07-03 09:49:18.477: E/Fitness(19288): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
07-03 09:49:18.477: E/Fitness(19288): at sqo.run(Unknown Source:7)
07-03 09:49:18.477: E/Fitness(19288): at java.lang.Thread.run(Thread.java:764)
07-03 09:49:18.478: E/health(17059): Cannot read goals, status code 5008, message null
的步进器
IBOutlet
声明一个@IBOutlet var stepper: UIStepper!
属性
NSKeyValueObservation
在var observation : NSKeyValueObservation?
中观察步进器的viewDidLoad
并在 new 值为0时对其进行调整。KVO的好处是您可以获得value
和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
答案 1 :(得分:1)
我将从另一个方向来处理这个问题。让步进器执行其操作,然后更改您对此的解释。
例如,如果您有一个步进器,想从-5
转到+5
,但跳过0
:
minumum
设置为-5
。maximum
设置为4
。stepValue
设置为1
。当您阅读步进value
时,如果1
为非负数,请添加value
:
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
。