🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

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

Swift

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

Q&A

解決済

1回答

830閲覧

[swift] isHiddenを書き込んでもエラーが出てしまいます

rioha_nishimura

総合スコア1

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/02/28 08:29

編集2021/02/28 08:37

前提・実現したいこと

Swiftで、一定時間ごとにダミー着信+応答すると音声再生ができるアプリを作っています。

  • 音声が再生されているor通話状態の間だけ、画面に切電ボタンが表示される
  • 音声が再生されていないor通話状態ではないときは切電ボタンは非表示になる

これが目標です。
ふわっと消えるとかはできたら嬉しいけど、とりあえず消えるだけでも実装したいです。

発生している問題

button.isHidden = false

これを使うというのは分かるのですが、
音声の再生状態や通話状態に対応させたい場合、どこに書き込めば良いのかわかりません。
CallKitのCXCallObserverらへんでもできるのかもしれませんが、これもうまく合体できませんでした…

該当のソースコード

丸ごと貼ります。

swift

1import UIKit 2import CallKit 3import PushKit 4import AVFoundation 5 6var callON = false 7var callNow = false 8var uuid = UUID() 9 10class ViewController: UIViewController { 11 12 var audioPlayer: AVAudioPlayer! 13 let url = Bundle.main.bundleURL.appendingPathComponent("voice.mp3") 14 15 override func viewDidLoad() { 16 17 super.viewDidLoad() 18 19 //声をバッファに読み込んでおく 20 do { 21 try audioPlayer = AVAudioPlayer(contentsOf: url) 22 audioPlayer.prepareToPlay() 23 } catch { 24 print(error) 25 } 26 27 let audioSession = AVAudioSession.sharedInstance() 28 do { 29 try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.voiceChat, options: AVAudioSession.CategoryOptions.duckOthers) 30 //声を上のスピーカーから鳴らす 31 try audioSession.overrideOutputAudioPort(.none) 32 try audioSession.setActive(true) 33 } catch { 34 debugPrint(error.localizedDescription) 35 } 36 37 Timer.scheduledTimer( 38 timeInterval: 10, 39 target: self, 40 selector: #selector(self.vibrate(_:)), 41 userInfo: nil, 42 repeats: false ) 43 44 45 } 46 47 48 @objc func call(_ sender: Any) { 49 while (audioPlayer.isPlaying == false) { 50 print("再生準備中…") 51 audioPlayer.currentTime = 0 52 audioPlayer.play() 53 } 54 callNow = true 55 } 56 57 @objc func vibrate(_ sender: Timer) { 58 59 if ( callNow == false ) { 60 uuid = UUID() 61 let provider = CXProvider(configuration: CXProviderConfiguration(localizedName: "")) 62 provider.setDelegate(self, queue: nil) 63 let update = CXCallUpdate() 64 update.remoteHandle = CXHandle(type: .generic, value: "非通知") 65 provider.reportNewIncomingCall(with: uuid, update: update, completion: { error in }) 66 print("着信中") 67 } 68 } 69 70 @objc func end(_ sender: Any){ 71 72 let controller = CXCallController() 73 let transaction = CXTransaction(action:CXEndCallAction(call: uuid)); 74 controller.request(transaction,completion: { error in 75 if let error = error { 76 print(error) 77 } else { 78 print("電話が切れる") 79 } 80 }) 81 82 } 83 84 85 @IBAction func endButton(_ sender: Any) { 86 print("EndButton") 87 end((Any).self) 88 } 89 90 91} 92 93extension ViewController: CXProviderDelegate { 94 95 func providerDidReset(_ provider: CXProvider) { 96 print("providerDidReset") 97 } 98 99 func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) { 100 print("応答") 101 action.fulfill() 102 call((Any).self) 103 } 104 105 func provider(_ provider: CXProvider, perform action: CXEndCallAction) { 106 print("音声終了") 107 audioPlayer.stop() 108 callNow = false 109 action.fulfill() 110 111 Timer.scheduledTimer( 112 timeInterval: 4, 113 target: self, 114 selector: #selector(self.vibrate(_:)), 115 userInfo: nil, 116 repeats: false ) 117 118 } 119 120} 121 122 123extension ViewController: AVAudioPlayerDelegate { 124 func playSound(name: String) { 125 guard let path = Bundle.main.path(forResource: name, ofType: "mp3") else { 126 print("音源ファイルが見つかりません") 127 return 128 } 129 130 do { 131 // AVAudioPlayerのインスタンス化 132 audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path)) 133 134 // AVAudioPlayerのデリゲートをセット 135 audioPlayer.delegate = self 136 137 // 音声の再生 138 audioPlayer.play() 139 } catch { 140 } 141 } 142 143} 144

試したこと

endButton.isHidden = false
とりあえずこれを、

  • @objc func vibrateの中
  • callNow = Trueの後ろ

あたりに貼ってみたのですが…

Value of type '(Any) -> ()' has no member 'isHidden'

このエラーが出てきてしまいます。

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

  • Xcodeは12.4
  • Swiftは4.2

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おそらく endButton というのは UIButton インスタンスを想定していると思うのですが、どこにも定義されていません。
つまりボタンがないということです。
存在しないボタンを非表示にはできません。

もし、Storyboard等にボタンを置いているのであれば、それを繋ぎこんでください。

投稿2021/02/28 09:19

errolizer

総合スコア441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rioha_nishimura

2021/02/28 09:21

ありがとうございます! @IBAction func endButton(_ sender: Any) { print("EndButton") end((Any).self) } ボタンの定義はこの部分でやっていたつもりなのですが、 これとは違うのでしょうか…?
errolizer

2021/02/28 09:30

これは IBAction 定義ですね。つまりボタンを押した時の「行動」を繋いでいるイメージです。 ボタンそのものをつなぐには IBOutlet で定義します。Storyboardから引っ張ってくるときにモーダルが出るので設定できますよ。
rioha_nishimura

2021/02/28 15:13

なるほど!!Storyboardから引っ張ってくるときに、アクションだけ引っ張ってきて設置していたようです。 @IBOutlet var endButton :UIButton! これで定義できました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問