У меня есть набор степперов, и при суммировании они должны давать 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 разных «игроков»: