質問編集履歴

1 Pickerコードの追加

natsusoranosita

natsusoranosita score 18

2017/04/28 10:18  投稿

PickerTextFieldで選択された文字によって違うアクションを実行したい
###前提・実現したいこと
簡単な計算アプリで、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]  
   }  
}  
 
```  
###試したこと
遷移画面後での計算結果を表示する仕様だったので、もしや計算はできているけど送る方法に間違いがあるのかと思い、同じ画面にラベルを置いてデータを受け取るようにしたのですがうまく行きませんでした。
  • Xcode

    8336 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • Swift

    14426 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Swift 2

    1355 questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

  • iOS 9

    217 questions

    iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

  • Xcode 7

    621 questions

    Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る