PickerTextFieldで選択された文字によって違うアクションを実行したい
- 評価
- クリップ 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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.98%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正の依頼
fuzzball
2017/04/28 10:06
koutiku()やnanido()は実行されていますか?ちなみに、PickerTextFieldというのは https://github.com/lattesir/PickerTextField これのことでしょうか?
natsusoranosita
2017/04/28 10:17
実行というのは文字が表示されているかという事でしょうか?おそらく違う意味かと思うのですが、その意味ならば、文字はしっかりと表示できています。Pickerのコードを追加で載せさせていただきました。お手数ですが確認のほどよろしくお願いします。
fuzzball
2017/04/28 10:36
実行というのは、呼び出されているか?という意味です。PickerTextFieldの質問にも回答をお願いします。
fuzzball
2017/04/28 10:41 編集
PickerTextFieldは自作ってことですか?
natsusoranosita
2017/04/28 10:47
お返事ありがとうございます!授業が始まってしまうので、90分後にまとめてお返事させていただきます。お時間取らせてしまい申し訳有りませんが、引き続きよろしくお願いします。
fuzzball
2017/04/28 10:57
どうやってPickerTextFieldを生成しているかも書いて下さい。
natsusoranosita
2017/04/28 19:30
Pickerは以前テラテイルで質問した際に回答いただいたものを使わせていただいています。自分の過去の質問の解答欄に残っています!先ほど、if文の中に簡単な動作を記入したのですが動かなかったので、呼び出せていないようでした。
fuzzball
2017/04/28 19:46
あなたの過去の質問を探す気はありませんし、こちらの質問にも答えていただけないようですので、これにて失礼します。以前回答してくれた親切な人がまた回答してくれるでしょう。