首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止UIStepper成为0?

防止UIStepper成为0?
EN

Stack Overflow用户
提问于 2019-07-03 07:29:37
回答 2查看 817关注 0票数 1

我有一个UIStepper,它有stepValue of 1。我希望UIStepper能够在其maximumminimum值之前是正的或负的,但绝不是0

我为解决这个问题所做的每一次尝试都无法解释步骤是在减少还是在增加(因此应该跳过01-1)。我唯一能想到的另一件事是保存先前的值并进行比较,但这听起来有点牵扯到这样一个简单的任务。

有什么想法吗?还有其他人遇到过同样的要求吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-03 09:52:17

我会从另一个方向来处理这个问题。让步进者做它所做的,然后改变你对它的解释。

例如,如果您有一个步骤,您想从-5转到+5,但跳过0

  1. 将stepper minumum设置为-5
  2. 将stepper maximum设置为4
  3. 将stepper stepValue设置为1
  4. 当您阅读步骤value时,如果value是非负的,则添加value: 设值= stepper.value + (stepper.value <0 0: 1)
  5. 当您设置步骤value时,首先通过1降低正值: // 3的值在步进器中由2值=3 stepper.value =值-(值>0 1: 0)表示。

使用nonZeroValue 计算属性隐藏详细信息

您可以通过为+1创建一个扩展来隐藏这些-1nonZeroValue调整,该扩展添加了一个名为nonZeroValue的新计算属性。

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2019-07-03 08:19:06

用键值观察很容易。它需要步进器的IBOutlet

代码语言:javascript
复制
@IBOutlet var stepper: UIStepper!

声明NSKeyValueObservation属性

代码语言:javascript
复制
var observation : NSKeyValueObservation?

viewDidLoad中,观察步骤的value,并在新值为0时对其进行调整。KVO的好处是您可以获得oldnew值来检测步长方向。

代码语言:javascript
复制
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中分配观察者。

代码语言:javascript
复制
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来释放观察者

代码语言:javascript
复制
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let tableCell = cell as! MyGreatCell
    tableCell.observation = nil
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56865070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档