禁用UIStepper的一半

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了禁用UIStepper的一半相关的知识,希望对你有一定的参考价值。

我有一套步进器,而不是加起来他们应该给X量。它们都在UICollectionview中,我使用委托在它们和ViewController之间传递值。 你应该在不同的玩家之间分配积分,一旦你达到分配给你的积分总数你就不能再“添加”积分了。一旦达到总点数,我想禁用步进器的“一半”。我怎样才能做到这一点? (不禁用整个步进器,因为用户可能想要重新分配点并返回其中的一些点)。

到目前为止,这是我的代码:

    protocol CollectionVCDelegate: class {
        func usedPoints() -> Int
        func returnPoints() -> Int
    }
    class PointAllocationVC: UIViewController, CollectionVCDelegate {

        func usedPoints() -> Int {
            pointsToAllocate -= 1
            totalPointsLabel.text = String(pointsToAllocate)
            return pointsToAllocate
        }

        func returnPoints() -> Int
        {
            pointsToAllocate += 1
            totalPointsLabel.text = String(pointsToAllocate)
            return pointsToAllocate
        }
    var pointsToAllocate: Int = 5 //may change, 5 for example
    @IBOutlet weak var ptsAllocView: UIView!
    @IBOutlet weak var totalPointsLabel: UILabel!
    @IBOutlet weak var addAllButton: UIButton!
    @IBOutlet weak var ptAllocCollectionView: UICollectionView!
}

extension PointAllocationVC: UICollectionViewDelegate, UICollectionViewDataSource
{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return currentPlayers.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let myptCell = collectionView.dequeueReusableCell(withReuseIdentifier: "ptsCell", for: indexPath) as! PtsAllocationViewCell
        myptCell.playerNameLabel.text = currentPlayers[indexPath.row]
        myptCell.playerScoreLabel.text = "Score: (currentScore[indexPath.row])"
        myptCell.delegate = self

        if indexPath.row == 0
        {
            myptCell.ptsAllocStepper.minimumValue = 0
        }
        else
        {
            myptCell.ptsAllocStepper.maximumValue = 0
            myptCell.isSelf = false
        }

        return myptCell
    }
}

现在,这是ViewCells的代码:

import UIKit

class PtsAllocationViewCell: UICollectionViewCell {
    var delegate: CollectionVCDelegate? = nil
    var isSelf = true
    var ptsRemaining: Int = 0
    @IBOutlet weak var ptsLabel: UILabel!
    @IBOutlet weak var playerNameLabel: UILabel!
    @IBOutlet weak var playerScoreLabel: UILabel!
    @IBOutlet weak var ptsAllocStepper: UIStepper!
    @IBAction func stepperTapped(_ sender: UIStepper) {
        let myInt: Int = Int(ptsLabel.text!)!
        if delegate != nil
        {
            if isSelf
            {
                if myInt > Int(sender.value)
                {
                    ptsRemaining = (delegate?.returnPoints())!
                }
                else
                {
                    ptsRemaining = (delegate?.usedPoints())!
                }

            }
            else
            {
                if myInt > Int(sender.value)
                {
                    ptsRemaining = (delegate?.usedPoints())!
                }
                else
                {
                    ptsRemaining = (delegate?.returnPoints())!
                }
            }
        }
        ptsLabel.text = String(Int(sender.value))
    }

}

注意:此代码的工作范围与我想要的一样多(就像从ViewController中添加/减去pointsToAllocate并更新标签和所有。但是,截至目前,没有锁定阻止用户形成过度使用点(比如说)他最多可以加5分,最后总共得到-15分,你不应该低于0)

只是为了增加清晰度这里是一张图片,请注意它将有大约4-6个不同的“玩家”:storyboard of ViewController

答案

将所有步进器的maximumValue设置为总点数,减去每次步进器值变化时已经分配的点数。你应该观察UIControlEvents.valueChanged

这样,如果达到最大点数,步进器的+半部分将被禁用。

UIStepper with + half disabled

另一答案

你可能无法“禁用+侧”......

选项:

  1. 使用两个按钮,而不是步进器。根据需要禁用“+”按钮,或
  2. 如果要禁用它,请设置增量图像以指示它已禁用,只是不处理“+”点击。
  3. UIStepper达到最小值或最大值时,它将自动禁用。请参阅@ the4kman的答案

以上是关于禁用UIStepper的一半的主要内容,如果未能解决你的问题,请参考以下文章

UIStepper iOS 7

UIStepper.value 变成科学记数法

swift - 如何从另一个类设置 UIStepper 值?

如何禁用在android片段类中按下的后退按钮

如何将“标签”字段中的数字值除以 UIStepper 的值?

oc之封装「可输入值」的UIStepper