19012


タイトルの通りなのですが、UIStepperを押す毎にLabelの数を変えたいと考えています。  
そこで以下のようなプログラムを書いたのですが、UIStepperを減らす方向に押す場合、画面がリフレッシュされず、TextFieldの数が変わらないという問題です。以下で、_dataNumは表示するデータの数で、この行より前で定義しています。_orderはその番号を表すUILabel配列でこれについても、コレよりも前に定義しました。  
なにかよい方法ありましたら、よろしくお願いします。

[code]

     internal func stepperChanged(Sender: UIStepper)  {
        if _dataNum < Int(Sender.value){
            _order.append(makeOrderLabel(dx, DataNum: _dataNum, i: _dataNum))
        }
    
        else if _dataNum > Int(Sender.value){
            _order.removeAtIndex(_dataNum-1)
            for var j = 0; j < _dataNum-1; j++ {
            self.view.addSubview(_order[j])
            }
        }
    
        _dataNum = Int(Sender.value)
    
    
    }
    
    func makeOrderLabel(dx: CGFloat, DataNum: Int, i: Int) -> UILabel {
    
        var frame: CGRect
            frame = CGRectMake(dx-170, 150+100*CGFloat(i), 80, 20)
            let _UILabel: UILabel = UILabel(frame: frame)
            _UILabel.text = "Data: \(i+1)"
            _UILabel.font = UIFont.systemFontOfSize(20)
            _UILabel.textAlignment = NSTextAlignment.Center
            _UILabel.lineBreakMode = NSLineBreakMode.ByCharWrapping
            _UILabel.numberOfLines = 0
            _UILabel.sizeToFit()
            self.view.addSubview(_UILabel)
    
        return UILabel()
    }
    
[/code]


CC BY-SA 3.0
2015-11-17T16:45:24.783
18958
2015-11-19T02:16:39.477
13272
question
ios swift xcode
UIStepperによってUILabelの数を変更


お粗末ながら、ステッパーでラベルを増やしたり減らしたりするシンプルな例を書いてみました。

[code]

    class ViewController: UIViewController {
    
        var labels = [UILabel]()
    
        @IBAction func didChangeStepperValue(sender: UIStepper) {
            let count = Int(sender.value)
            if (count > self.labels.count) {
                let frame = CGRectMake(0.0, 100.0 + 20.0 * CGFloat(count), 100.0, 20.0)
                let label = UILabel(frame: frame)
                label.text = "Data \(count)"
                self.labels.append(label)
                self.view.addSubview(label)
            } else if (count < self.labels.count) {
                guard let label = self.labels.last else {
                    return
                }
                label.removeFromSuperview()
                self.labels.removeLast()
            }
        }
    
    }
    
[/code]


CC BY-SA 3.0
2015-11-19T02:16:11.313
19011
2015-11-19T02:16:11.313
7283
18958
answer


`makeOrderLabel`メソッドの戻り値が`UILabel()`になっているのが原因です。  
UILabel()は新しいUILabelを生成して返すメソッドですので、せっかく作成したUILabelとは全く関係ない真っ更なUILabelを_orderに追加してしまっています。

addSubviewしたUILabelを配列管理するという実装を目指されていると思われるので、戻り値は`_UILabel`を返すべきです。

サンプルでアプリを組んでみましたが、修正することでラベルの増減が反映されることを確認しました。


CC BY-SA 3.0
2015-11-19T02:16:39.477
19012
2015-11-19T02:16:39.477
3227
18958
answer