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

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

ただいまの
回答率

90.01%

閉じるボタンを押すとエラーが発生するようになった

解決済

回答 1

投稿

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

M.minoru

score 17

前提・実現したいこと

Storyboardで先日Viewを並べて作ったものを Tableで作りなおしたのですがコードは特に変えていないのに実行してTextFieldをクリックしキーボードまたはPickerのToolbarにある完了(押すとキーボードなどを閉じるボタン)を押すとエラーが起きてしまいます

エラーの発生場所はAppDelegateの以下の場所でした
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

発生している問題・エラーメッセージ

Thread 1:signal SIGABRT

import UIKit

class kinmuTable: UITableViewController, UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate, UIToolbarDelegate {

    //配列の作成
    let furikyuuList = ["","○",]
    let chouseiList = ["","電車遅延","シフト勤務","変則シフト","早出遅出","本社出勤","本社退社","本社終日","客都出社"]

    @IBOutlet weak var kaishi: UITextField!
    @IBOutlet weak var syuuryou: UITextField!
    @IBOutlet weak var hosei: UITextField!
    @IBOutlet weak var sagyou: UILabel!
    @IBOutlet weak var zangyou: UILabel!
    @IBOutlet weak var shinya: UILabel!
    @IBOutlet weak var kintai: UILabel!
    @IBOutlet weak var kyuuka: UITextField!
    @IBOutlet weak var chousei: UITextField!
    @IBOutlet weak var furikyuu: UITextField!

    var toolBar:UIToolbar!

    //pickerViewの宣言
    let furikyuuSentaku = UIPickerView()
    let chouseiSentaku = UIPickerView()

    //今日の日付を代入
    let nowDate = NSDate()
    let dateFormat = NSDateFormatter()

    //DatePickerの宣言
    let kaishiSentaku = UIDatePicker()
    let syuuryouSentaku = UIDatePicker()
    let hoseiSentaku = UIDatePicker()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        furikyuuSentaku.delegate = self
        furikyuuSentaku.dataSource = self
        chouseiSentaku.delegate = self
        chouseiSentaku.dataSource = self
        self.kaishi.delegate = self
        self.syuuryou.delegate = self
        self.hosei.delegate = self

        //tag設定
        furikyuuSentaku.tag = 0
        chouseiSentaku.tag = 1

        kaishiSentaku.tag = 0
        syuuryouSentaku.tag = 1
        hoseiSentaku.tag = 2

        //Pickerviewを入れる
        furikyuu.inputView = furikyuuSentaku
        chousei.inputView = chouseiSentaku

        //日付フィールドの設定
        dateFormat.dateFormat = "HH:mm"
        kaishi.text = dateFormat.stringFromDate(nowDate)
        syuuryou.text = dateFormat.stringFromDate(nowDate)
        hosei.text = dateFormat.stringFromDate(nowDate)

        //datepickerを日本語にする
        kaishiSentaku.locale = NSLocale(localeIdentifier: "ja_JP")
        syuuryouSentaku.locale = NSLocale(localeIdentifier: "ja_JP")
        hoseiSentaku.locale = NSLocale(localeIdentifier: "ja_JP")

        // DatePickerの設定(日付用)
        kaishiSentaku.datePickerMode = UIDatePickerMode.Time
        kaishi.inputView = kaishiSentaku
        syuuryouSentaku.datePickerMode = UIDatePickerMode.Time
        syuuryou.inputView = syuuryouSentaku
        hoseiSentaku.datePickerMode = UIDatePickerMode.Time
        hosei.inputView = hoseiSentaku


        // UIToolBarの設定
        toolBar = UIToolbar(frame: CGRectMake(0, self.view.frame.size.height/6, self.view.frame.size.width, 40.0))
        toolBar.layer.position = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height-20.0)
        toolBar.barStyle = .BlackTranslucent
        toolBar.tintColor = UIColor.whiteColor()
        toolBar.backgroundColor = UIColor.blackColor()

        //完了ボタンのセット
        //右寄せのためのスペース設定
        let spaceBarBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace,target: self,action: Selector(""))

        //設置
         let toolBarBtn      = UIBarButtonItem(title: "完了", style: .Done, target: self, action: Selector("toolBarBtnPush:"))

        //ツールバーにボタンを表示
        toolBar.items = [spaceBarBtn,toolBarBtn]

        kaishi.inputAccessoryView = toolBar
        syuuryou.inputAccessoryView = toolBar
        hosei.inputAccessoryView = toolBar
        kyuuka.inputAccessoryView = toolBar
        chousei.inputAccessoryView = toolBar
        furikyuu.inputAccessoryView = toolBar

    }

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

    // 項目の数
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {

        return 1
    }

    // 要素数
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        if pickerView.tag == 0{
            return self.furikyuuList.count
        }
        if pickerView.tag == 1{
            return self.chouseiList.count
        }
        return 0
    }

    //要素を表す文字列
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

        if pickerView.tag == 0{
            return self.furikyuuList[row]
        }
        if pickerView.tag == 1{
            return self.chouseiList[row]
        }
        return ""
    }

    //テキストフィールドに表示
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        if pickerView.tag == 0{
            furikyuu.text = self.furikyuuList[row]
        }
        if pickerView.tag == 1{
            chousei.text = self.chouseiList[row]
        }
    }

    func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
        return 50
    }

    // 「完了」を押すと閉じる
    func tappedToolBarBtn(sender: UIBarButtonItem) {

        kaishi.text = dateFormat.stringFromDate(kaishiSentaku.date)
        syuuryou.text = dateFormat.stringFromDate(syuuryouSentaku.date)
        hosei.text = dateFormat.stringFromDate(hoseiSentaku.date)

        kaishi.resignFirstResponder()
        syuuryou.resignFirstResponder()
        hosei.resignFirstResponder()
        kyuuka.resignFirstResponder()
        chousei.resignFirstResponder()
        furikyuu.resignFirstResponder()

    }

試したこと

コードの転載ミスがないかのチェックは行いました

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • _Kentarou

    2016/07/25 21:19

    アプリが落ちた際デバックログのエリアには何も出力されていませんでしたか?されているのでしたら、そちらも載せてください。

    キャンセル

  • M.minoru

    2016/07/26 09:18

    デバッグエリアには以下の出力がありました。
    ```
    2016-07-26 09:12:11.182 KinmuTable[667:13221] -[KinmuTable.kinmuTable toolBarBtnPush:]: unrecognized selector sent to instance 0x7faa41da5740
    2016-07-26 09:12:11.186 KinmuTable[667:13221] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[KinmuTable.kinmuTable toolBarBtnPush:]: unrecognized selector sent to instance 0x7faa41da5740'
    *** First throw call stack:
    (
    0 CoreFoundation 0x000000010df1cd85 __exceptionPreprocess + 165
    1 libobjc.A.dylib 0x000000010fcc0deb objc_exception_throw + 48
    2 CoreFoundation 0x000000010df25d3d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3 CoreFoundation 0x000000010de6bcfa ___forwarding___ + 970
    4 CoreFoundation 0x000000010de6b8a8 _CF_forwarding_prep_0 + 120
    5 UIKit 0x000000010e746a8d -[UIApplication sendAction:to:from:forEvent:] + 92
    6 UIKit 0x000000010eb54067 -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 152
    7 UIKit 0x000000010e746a8d -[UIApplication sendAction:to:from:forEvent:] + 92
    8 UIKit 0x000000010e8b9e67 -[UIControl sendAction:to:forEvent:] + 67
    9 UIKit 0x000000010e8ba143 -[UIControl _sendActionsForEvents:withEvent:] + 327
    10 UIKit 0x000000010e8ba2be -[UIControl _sendActionsForEvents:withEvent:] + 706
    11 UIKit 0x000000010e8b9263 -[UIControl touchesEnded:withEvent:] + 601
    12 UIKit 0x000000010e7b999f -[UIWindow _sendTouchesForEvent:] + 835
    13 UIKit 0x000000010e7ba6d4 -[UIWindow sendEvent:] + 865
    14 UIKit 0x000000010e765dc6 -[UIApplication sendEvent:] + 263
    15 UIKit 0x000000010e73f553 _UIApplicationHandleEventQueue + 6660
    16 CoreFoundation 0x000000010de42301 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    17 CoreFoundation 0x000000010de3822c __CFRunLoopDoSources0 + 556
    18 CoreFoundation 0x000000010de376e3 __CFRunLoopRun + 867
    19 CoreFoundation 0x000000010de370f8 CFRunLoopRunSpecific + 488
    20 GraphicsServices 0x00000001125b2ad2 GSEventRunModal + 161
    21 UIKit 0x000000010e744f09 UIApplicationMain + 171
    22 KinmuTable 0x000000010dd262e2 main + 114
    23 libdyld.dylib 0x000000011078492d start + 1
    24 ??? 0x0000000000000001 0x0 + 1
    )
    libc++abi.dylib: terminating with uncaught exception of type NSException
    (lldb)
    ```

    キャンセル

回答 1

checkベストアンサー

+1

以下のコードで完了ボタン押下時のアクションがtoolBarBtnPush:に設定されていますがコードを見る限り設定されていませんのでメソッドがなく落ちています。

//設置
let toolBarBtn = UIBarButtonItem(title: "完了", style: .Done, target: self, action: Selector("toolBarBtnPush:"))

完了時のイベントはtappedToolBarBtn:というアクションがあるのでこれと紐付けるように修正する(メソッド名を同じ名前にする)と大丈夫だと思います。

// 「完了」を押すと閉じる
func tappedToolBarBtn(sender: UIBarButtonItem) {

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/26 13:57

    無事に解決することができました
    ありがとうございます

    キャンセル

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

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