Отключение половины 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 разных «игроков»: раскадровка ViewController


person dvd.Void    schedule 19.12.2017    source источник


Ответы (2)


Установите для всех степперов maximumValue общее количество баллов за вычетом уже выделенных баллов каждый раз при изменении значения степпера. Вы должны соблюдать UIControlEvents.valueChanged для этого.

Таким образом, половина + степпера будет отключена, если вы наберете максимальное количество очков.

UIStepper с + наполовину отключен

person Tamás Sengel    schedule 19.12.2017
comment
Привет, the4kman, это сработало бы, если бы у меня был только 1 степпер. Однако, поскольку у меня есть 4+ степпера, если каждый из них имеет максимальное значение общего количества баллов, то мне нужно выделить в 4 раза больше баллов. Единственным способом было бы динамическое изменение максимальных значений, скажем, если я использую 1 точку, все степперы имеют на 1 точку меньше максимума (кроме того, который уже использовал его) - person dvd.Void; 19.12.2017
comment
@ the4kman - ах ... Я не знал, что степпер автоматически отключает сторону, если степпер находится на минимальном или максимальном значении. Хорошо знать. - person DonMag; 19.12.2017

Вероятно, вы не можете "отключить сторону +"...

Опции:

  1. Используйте две кнопки вместо степпера. Отключите кнопку «+» по желанию или

  2. Установите Increment Image, чтобы указать, что оно отключено, когда вы хотите отключить его, и просто не обрабатывайте нажатия «+».

  3. Каждая сторона UIStepper будет автоматически отключена, когда она достигнет своего минимального или максимального значения. Смотрите ответ от @the4kman

person DonMag    schedule 19.12.2017