質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.98%

PickerTextFieldで選択された文字によって違うアクションを実行したい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 854

前提・実現したいこと

簡単な計算アプリで、textFieldをタップすると選択肢が表示され、選択された文字列によって違うアクション・計算を行いたかったので下記のように記入し、xcode場でも特にエラーメッセージは表示されなかったのですが、ビルドした際、選択しても計算結果が表示されませんでした。
下記の記述の仕方に間違いはありますか?

該当のソースコード

    var a = Double()
    var b = Double()
    var price = Double()

 @IBAction func koutiku(_ sender: PickerTextField) {
        if koutikuTextField.pickerDataArray == ["新規構築"]{
            a = a + 10
        }
        else if koutikuTextField.pickerDataArray == ["再構築"]{
            a = a + 12
        }
    }
    @IBAction func nanido(_ sender: PickerTextField) {
        if nanidoTextField.pickerDataArray == ["難しい"]{
            b = b + 11
        }
        if nanidoTextField.pickerDataArray == ["普通"]{
            b = b + 13
        }
        else if nanidoTextField.pickerDataArray == ["易しい"]{
            b = b + 15
        }
    }

Pickerのコード

import Foundation
import UIKit

@objc
protocol PickerTextFieldDelegate: class {
    @objc optional func pushDoneButton(pickerTextField: PickerTextField, text: String)
    @objc optional func pushCancelButton(pickerTextField: PickerTextField)
}

class PickerTextField: UITextField, UIPickerViewDelegate, UIPickerViewDataSource {

    weak var pickerTextFieldDelegate: PickerTextFieldDelegate?

    private let pickerView = UIPickerView()
    private let toolbarHeight: CGFloat = 44

    var pickerDataArray = [String]() {
        didSet {
            if let selectText = pickerDataArray.first {
                self.selectText = selectText
            }
        }
    }

    private var selectText: String = ""
    var defaultText: String! {
        get { return self.text }
        set {
            if let selectIndex = pickerDataArray.index(of: newValue) {
                pickerView.selectRow(selectIndex, inComponent: 0, animated: false)
            }
            self.text = newValue
        }
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        self.tintColor = UIColor.clear
        pickerView.delegate   = self
        pickerView.dataSource = self
    }

    // 入力カーソル非表示
    override func caretRect(for position: UITextPosition) -> CGRect {
        return CGRect.zero
    }
    // 範囲選択カーソル非表示
    override func selectionRects(for range: UITextRange) -> [Any] {
        return []
    }

    // コピー・ペースト・選択等のメニュー非表示
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }

    override var inputAccessoryView: UIView? {
        get {
            let toolBar = UIToolbar()
            toolBar.barStyle = UIBarStyle.default
            toolBar.isTranslucent = true
            toolBar.tintColor = UIColor.black
            let doneButton   = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(self.pushDoneButton))
            let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(self.pushCancelButton))
            let spaceButton  = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
            toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
            toolBar.isUserInteractionEnabled = true
            toolBar.sizeToFit()

            return toolBar
        }
        set {}
    }

    override var inputView: UIView? {
        get {
            (self.value(forKeyPath: "textInputTraits") as AnyObject).setValue(UIColor.clear, forKey: "insertionPointColor")
            self.tintColor = UIColor.clear
            pickerView.frame = CGRect(x: 0,
                                      y: toolbarHeight,
                                      width: UIScreen.main.bounds.size.width,
                                      height: pickerView.bounds.size.height)
            pickerView.backgroundColor = UIColor.white
            return pickerView
        }
        set {}
    }

    // Done
    @objc private func pushDoneButton() {
        self.text = selectText
        pickerTextFieldDelegate?.pushDoneButton?(pickerTextField: self, text: selectText)
        resignFirstResponder()
    }

    // Cancel
    @objc private func pushCancelButton() {
        pickerTextFieldDelegate?.pushCancelButton?(pickerTextField: self)
        resignFirstResponder()
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return pickerDataArray[row]
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerDataArray.count
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        selectText = pickerDataArray[row]
    }
}

試したこと

遷移画面後での計算結果を表示する仕様だったので、もしや計算はできているけど送る方法に間違いがあるのかと思い、同じ画面にラベルを置いてデータを受け取るようにしたのですがうまく行きませんでした。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • fuzzball

    2017/04/28 10:57

    どうやってPickerTextFieldを生成しているかも書いて下さい。

    キャンセル

  • natsusoranosita

    2017/04/28 19:30

    Pickerは以前テラテイルで質問した際に回答いただいたものを使わせていただいています。自分の過去の質問の解答欄に残っています!先ほど、if文の中に簡単な動作を記入したのですが動かなかったので、呼び出せていないようでした。

    キャンセル

  • fuzzball

    2017/04/28 19:46

    あなたの過去の質問を探す気はありませんし、こちらの質問にも答えていただけないようですので、これにて失礼します。以前回答してくれた親切な人がまた回答してくれるでしょう。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる