禁用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)
答案
将所有步进器的maximumValue
设置为总点数,减去每次步进器值变化时已经分配的点数。你应该观察UIControlEvents.valueChanged
。
这样,如果达到最大点数,步进器的+半部分将被禁用。
另一答案
你可能无法“禁用+侧”......
选项:
- 使用两个按钮,而不是步进器。根据需要禁用“+”按钮,或
- 如果要禁用它,请设置增量图像以指示它已禁用,只是不处理“+”点击。
- 当
UIStepper
达到最小值或最大值时,它将自动禁用。请参阅@ the4kman的答案
以上是关于禁用UIStepper的一半的主要内容,如果未能解决你的问题,请参考以下文章
swift - 如何从另一个类设置 UIStepper 值?