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

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

ただいまの
回答率

88.59%

UIPickerViewでThread 1: signal SIGABRT

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 681

shin6847

score 18

 前提・実現したいこと

UIPickerViewで値を入力しようと決定ボタンを押した時このエラーが発生しました。
テキストフィールドに値は代入されていました

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

Thread 1: signal SIGABRT
#console error
2018-10-31 02:53:52.064126+0100 myapp[15625:1315878] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x600000bf3d90 UILabel:0x7fc9f7d1ef20'Music List'.top >= UILayoutGuide:0x6000011810a0'TitleView(0x7fc9f7d11b50)'.top   (active)>",
    "<NSLayoutConstraint:0x600000bf3ca0 UILabel:0x7fc9f7d1ef20'Music List'.firstBaseline == UILayoutGuide:0x6000011810a0'TitleView(0x7fc9f7d11b50)'.top + 28   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000bf3d90 UILabel:0x7fc9f7d1ef20'Music List'.top >= UILayoutGuide:0x6000011810a0'TitleView(0x7fc9f7d11b50)'.top   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
2
2018-10-31 02:53:58.912895+0100 myapp[15625:1315878] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /Users/appleiii/Library/Developer/CoreSimulator/Devices/81E3701C-6E1D-4773-B905-5ACE8A21E5E1/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2018-10-31 02:53:58.913954+0100 myapp[15625:1315878] [MC] Reading from private effective user settings.
1
2
2018-10-31 02:54:02.751505+0100 myapp[15625:1315878] -[NSTaggedPointerString myok:]: unrecognized selector sent to instance 0xc5238370774d43df
2018-10-31 02:54:02.767196+0100 myapp[15625:1315878] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString myok:]: unrecognized selector sent to instance 0xc5238370774d43df'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010655729b __exceptionPreprocess + 331
    1   libobjc.A.dylib                     0x0000000105679735 objc_exception_throw + 48
    2   CoreFoundation                      0x0000000106575fa4 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
    3   CoreFoundation                      0x000000010655bfb6 ___forwarding___ + 1446
    4   CoreFoundation                      0x000000010655de88 _CF_forwarding_prep_0 + 120
    5   UIKitCore                           0x0000000110b667c3 -[UIApplication sendAction:to:from:forEvent:] + 83
    6   UIKitCore                           0x0000000110bd5b58 __45-[_UIButtonBarTargetAction _invoke:forEvent:]_block_invoke + 154
    7   UIKitCore                           0x0000000110bd5a91 -[_UIButtonBarTargetAction _invoke:forEvent:] + 152
    8   UIKitCore                           0x0000000110b667c3 -[UIApplication sendAction:to:from:forEvent:] + 83
    9   UIKitCore                           0x0000000110c9ee85 -[UIControl sendAction:to:forEvent:] + 67
    10  UIKitCore                           0x0000000110c9f1a2 -[UIControl _sendActionsForEvents:withEvent:] + 450
    11  UIKitCore                           0x0000000110c9e0e6 -[UIControl touchesEnded:withEvent:] + 583
    12  UIKitCore                           0x0000000111379334 -[UIWindow _sendTouchesForEvent:] + 2729
    13  UIKitCore                           0x000000011137aa30 -[UIWindow sendEvent:] + 4080
    14  UIKitCore                           0x0000000110b80e10 -[UIApplication sendEvent:] + 352
    15  UIKitCore                           0x0000000110ab90d0 __dispatchPreprocessedEventFromEventQueue + 3024
    16  UIKitCore                           0x0000000110abbcf2 __handleEventQueueInternal + 5948
    17  CoreFoundation                      0x00000001064bab31 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    18  CoreFoundation                      0x00000001064ba3a3 __CFRunLoopDoSources0 + 243
    19  CoreFoundation                      0x00000001064b4a4f __CFRunLoopRun + 1263
    20  CoreFoundation                      0x00000001064b4221 CFRunLoopRunSpecific + 625
    21  GraphicsServices                    0x000000010bf041dd GSEventRunModal + 62
    22  UIKitCore                           0x0000000110b65115 UIApplicationMain + 140
    23  myapp                               0x0000000104d350d7 main + 71
    24  libdyld.dylib                       0x0000000108b34551 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

 該当のソースコード

import UIKit
import AVFoundation

class playViewController: UIViewController, UITextFieldDelegate{

    let engine = AVAudioEngine()
    let speedControl = AVAudioUnitVarispeed()
    let pitchControl = AVAudioUnitTimePitch()

    @IBOutlet weak var pitchText: UITextField!
    @IBOutlet weak var speedText: UITextField!
    let myPicker = UIPickerView()
    let toolBar = UIToolbar()
    var selectedField = 0

    var dataList:[String] = []
    let speedList:[String] = ["10", "20", "30", "40", "50", "60", "70", "80", "90", "100",
                           "110", "120", "130", "140", "150", "160", "170", "180", "190", "200"]
    let pitchList:[String] = ["-12", "-11", "-10", "-9", "-8", "-7", "-6", "-5", "-4", "-3", "-2", "-1", "0",
                        "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "24"]

    override func viewDidLoad() {
        super.viewDidLoad()
        pitchText.delegate = self
        speedText.delegate = self
        pitchText.tag = 1
        speedText.tag = 2
        createPicker()
        createToolBar()
    }

    func play(_ url: URL) throws {
        let audioFile = try AVAudioFile(forReading: url)
        let audioPlayer = AVAudioPlayerNode()

        engine.attach(audioPlayer)
        engine.attach(pitchControl)
        engine.attach(speedControl)

        engine.connect(audioPlayer, to: speedControl, format: nil)
        engine.connect(speedControl, to: pitchControl, format: nil)
        engine.connect(pitchControl, to: engine.mainMixerNode, format: nil)

        // 5: prepare the player to play its file from the beginning
        audioPlayer.scheduleFile(audioFile, at: nil)

        try engine.start()
        audioPlayer.play()
    }

    func getSampleRate(_ url: URL) throws -> (Double) {
        let audioFile = try AVAudioFile(forReading: url)
        let sampleRate = audioFile.fileFormat.sampleRate
        let duration = Double(audioFile.length) / sampleRate
        return duration
    }

    func createPicker() {
        myPicker.delegate = self
        myPicker.dataSource = self
        myPicker.frame = CGRect(x: 0, y: 4500, width:375.0, height: 162.0)
        myPicker.backgroundColor = UIColor.white
        speedText.inputView = myPicker
        pitchText.inputView = myPicker
    }

    func createToolBar() {
        toolBar.sizeToFit()
        let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: "self", action: Selector(("myok:")))
        toolBar.setItems([doneButton], animated: false)
        toolBar.isUserInteractionEnabled = true

        speedText.inputAccessoryView = toolBar
        pitchText.inputAccessoryView = toolBar
    }

    func myok(sender: UIBarButtonItem) {
        view.endEditing(true)
    }

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        //dataList = textField.tag == 1 ? pitchList : speedList
        if textField.tag == 1 {
            dataList = pitchList
            selectedField = 1
            print(selectedField)
        } else if textField.tag == 2 {
            dataList = speedList
            selectedField = 2
            print(selectedField)
        } else {
            print("error")
        }
        myPicker.reloadAllComponents()
        return true
    }

}

extension playViewController: UIPickerViewDelegate, UIPickerViewDataSource {

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

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

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

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
         if selectedField == 1 {
            inputvalue = dataList[row]
            pitchText.text = inputvalue
            inputvalue = ""
        } else if selectedField == 2 {
            inputvalue = dataList[row]
            speedText.text = inputvalue
            inputvalue = ""
        }else {
            print("error")
        }
    }
}


ストーリーボードのリファレンスアウトレット
イメージ説明
イメージ説明

 試したこと

resignFirstResponder()も試しましたが結果は同じでした。

 補足情報(FW/ツールのバージョンなど)

swift4.2

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • fuzzball

    2018/10/31 10:57

    Consoleに表示されるエラーメッセージを書いて下さい。「テキストフィールドに値は代入されていました」はどうやって確認したのでしょうか?

    キャンセル

  • shin6847

    2018/10/31 11:01

    Thread 1: signal SIGABRTが出た後のシミュレータを確認したら値がテキストフィールドに入っていました

    キャンセル

回答 1

checkベストアンサー

+1

reason: '-[NSTaggedPointerString myok:]: unrecognized selector sent to instance 0xc5238370774d43df'

というエラーですから、NSTaggedPointerStringクラスのmyokメソッドを呼び出そうとしてエラーになっています。
コードを見ると

let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: "self", action: Selector(("myok:")))

となっています。
targetに指定しているのが "self"という文字列を指定しているからNSTaggedPointerStringという文字列クラスに対してmyokメソッドを呼び出そうとしてエラーになったのだと思います。とりあえずそこは文字列ではなくて selfを指定する必要がありますが、actionで指定しているselectorも古い書き方になっているので、次のようにする必要があります。

(doneButton作成処理)

let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(myok(_:)))


(myokメソッドの宣言部分)

@objc func myok(_ sender: UIBarButtonItem) {

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/06 19:58

    ありがとうございます

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る