2017-12-19 13 views
0

私は加算したときよりもステッパのセットを持っています。それらはすべてUICollectionviewにあり、私はデリゲートを使ってそれらとViewControllerの間で値を渡しました。
あなたは割り当てられたポイントの合計数に達すると、別のプレイヤーにポイントを割り当てることになっています。私はポイントの総数に達すると、ステッパーの「半分」を無効にしたい。これどうやってするの? (ステッパー全体を無効にすることなく、ユーザーはポイントを再割り当てしてそのポイントの一部を戻すことができるため)。UIStepperの半分を無効にする

ここでは、これまでに私のコードです:

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

答えて

0

  1. ステッパーの代わりに2つのボタンを使用します。 "+"ボタンを無効にするか、

  2. 無効にするには無効にし、 "+"タップは処理しないでください。

  3. UIStepperの各辺は、最小値または最大値に達すると自動的に無効になります。すべてのステッパーmaximumValueポイントの合計数に設定し

0

the4kman @からの回答、マイナスステッパーの値がを変更したとき、すでにたびに割り当てられたポイントを参照してください。あなたはそのためにUIControlEvents.valueChangedを観察する必要があります。

このようにして、ステッパーの+の半分は、最大ポイントに達すると無効になります。

UIStepper with + half disabled

+0

こんにちはthe4kman、それは私が1つのステッパーしか持っていないと動作します。しかし、私は4 +ステッパーを持っているので、それぞれがポイントの総数の最大値を持っていたら、私は4倍のポイントを割り当てます。唯一の方法は、最大値を「動的に」変更することです。たとえば、1ポイントを使用すると、すべてのステッパーが1ポイントを最大値にします(すでに1つを使用しているものを除く) –

+0

@ dvd.Void私の回答を更新しました。 – the4kman

+1

@ the4kman - ああ...私は、ステッパーが最小値または最大値にある場合、ステッパーが自動的にサイドを無効にすることを認識しませんでした。知っておいてよかった。 – DonMag

関連する問題