1

Swift 2. label.text の答えを使おうとしています! 再び増殖する。ラベルはオプションですが、Double で乗算する必要があります。

@IBOutlet weak var testLabel: UILabel!
@IBOutlet weak var first: UITextField!
@IBOutlet weak var second: UITextField!

func calculation1() {
let dfirst = Double(first.text!)
let dsecond = Double(second.text!)
if dfirst != nil && dsecond != nil {
let answerCal = ceil(dfirst! * dsecond!)
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = .DecimalStyle
testLabel.text = numberFormatter.stringFromNumber(answerCal)
}
}

どんな助けでも大歓迎です。

4

1 に答える 1

0

まず最初に、コード エディターにアクセスできないタブレットでこれをまとめたので、お詫び申し上げます。ただし、ここにあなたの問題に対する私の見解があります:

@IBOutlet weak var testLabel: UILabel!
@IBOutlet weak var first: UITextField!
@IBOutlet weak var second: UITextField!

func calculation1() -> Void {
    // Check our two text fields contain text
    guard let _ = first.text,
          let _ = second.text else { return }
  c // Check that the text can be parsed as Doubles
  c guard let dfirst : Double = Double(first.text!),
    let dsecond : Double = Double(second.text!) else { return }

    // Now that we know we have two valid numbers, do the calculation
    let answerCal : Double = ceil(dfirst! * dsecond!)

    // Fetch a number formatter
    let numberFormatter : NSNumberFormatter = {
        let nF : NSNumberFormatter = NSNumberFormatter()
        nF.numberStyle = .DecimalStyle
        return nF
    }()
    // And update the text field with the answer if it produces a valid result
    if let answerText : String =     numberFormatter.stringFromNumber(answerCal) {
         testLabel.text = answerText
    }
}

最初に確認しないと、ユーザーが理論的に何でも入力してアプリをクラッシュさせる可能性がある UI 要素には注意する必要があります。したがって、テキスト フィールドにテキストがない場合、またはそれらのフィールドに使用できないテキストが含まれている場合に、メソッド呼び出しを安全に終了するガード ステートメントです。

数値フォーマッタから Optional を取得する理由は、フォーマッタが有効な文字列を提供できるという保証がないためです。したがって、テキスト フィールドを更新する前に、numbe フォーマッタが nil 以外の結果を生成することを明示的に確認したことがわかります。

(注 - 数値フォーマッタのクロージャーは技術的に要件を超えていることを理解していますが、オブジェクトを構成するときに明確になることがあります。)

アップデート:

Vidal - 私が送ったコードを試しましたか? 昨夜まとめたものに基づいて、次のことをすぐにノックアップしました. それは明らかに大雑把ですが、何かが欠けていない限り、私が提案した方法論がうまく機能することを示しています。私が考えることができる唯一の問題は、私が気付いていないインターフェイスビルダーで何かをしたということです。それが役立つことを願っています!

import UIKit

class ViewController: UIViewController {

    var calculatorView : UIView!
    var textFieldOne : UITextField!
    var textFieldTwo : UITextField!
    var calButton : UIButton!
    var answer : UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.calculatorView = {
                let cV : UIView = UIView(frame: CGRect(origin: CGPointZero, size: CGSizeMake(400, 400)))
            cV.backgroundColor = UIColor.redColor()

            func buildTextField() -> UITextField {
                let tF : UITextField = UITextField()
                tF.backgroundColor = UIColor.whiteColor()
                tF.textColor = UIColor.blackColor()
                tF.placeholder = "Please enter number"
                return tF
            }

            self.textFieldOne = buildTextField()
            self.textFieldTwo = buildTextField()
            self.textFieldOne.frame = CGRect(origin: CGPointMake(20, 20), size: CGSizeMake(160, 50))
            self.textFieldTwo.frame = CGRect(origin: CGPointMake(220, 20), size: CGSizeMake(160, 50))

            self.calButton = {
                let cB : UIButton = UIButton()
                cB.setTitle("Calculate", forState: .Normal)
                cB.frame = CGRect(origin: CGPointMake(20, 80), size: CGSizeMake(360, 50))
                cB.addTarget(self, action: #selector(self.getAnswer), forControlEvents: UIControlEvents.TouchUpInside)
                return cB
            }()

            self.answer = {
                let a : UILabel = UILabel()
                a.backgroundColor = UIColor.blueColor()
                a.textColor = UIColor.whiteColor()
                a.frame = CGRect(origin: CGPointMake(20, 140), size: CGSizeMake(360, 50))
                return a
            }()

            cV.addSubview(textFieldOne)
            cV.addSubview(textFieldTwo)
            cV.addSubview(calButton)
            cV.addSubview(answer)

            return cV
        }()

        self.view.addSubview(calculatorView)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func getAnswer() -> Void {
        // Check our two text fields contain text
        guard let _ = self.textFieldOne.text,
              let _ = self.textFieldTwo.text else { return }
        // Check that the text can be parsed as Doubles
        guard let dfirst : Double = Double(self.textFieldOne.text!),
              let dsecond : Double = Double(self.textFieldTwo.text!) else { return }

        // Now that we know we have two valid numbers, do the calculation
        let answerCal : Double = ceil(dfirst * dsecond)

        // Fetch a number formatter
        let numberFormatter : NSNumberFormatter = {
            let nF : NSNumberFormatter = NSNumberFormatter()
            nF.numberStyle = .DecimalStyle
            return nF
        }()
        // And update the text field with the answer if it produces a valid result
        if let answerText : String = numberFormatter.stringFromNumber(answerCal) {
            self.answer.text = answerText
        }
    }
}
于 2016-09-10T21:42:13.247 に答える