LoginSignup

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Swift】自動でボタンのクッリクアクションを起こしたい

解決したいこと

Xcodeで音声再生アプリをつくっています。
音声を自動で停止させる部分がわかりません。
解決方法を教えて下さい。

開発環境

Xcode Version 14.2
Interface Storyboard
macOS monterey 13.0.1

発生している問題・エラー

調査した結果、labelのonClickイベントを起こさせるコードは存在していたので変数名の部分だけ対象のボタンに変えました
下に記載したエラーの状況です。

Value of type 'UIButton' has no member 'onClick'

スクリーンショット 2023-01-20 2.35.19.png

該当するソースコード

import UIKit
import AVFoundation

class ViewController: UIViewController {
    
    @IBOutlet weak var btnCount: UIButton!
    @IBOutlet weak var btnExplosion: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        btnExplosion.isEnabled = false
    }
    
    var player: AVAudioPlayer?

    @IBAction func btnCount(_ sender: Any) {
        if let soundURL = Bundle.main.url(forResource: "timer", withExtension: "mp3") {
            do {
                player = try AVAudioPlayer(contentsOf: soundURL)
                player?.play()
            } catch {
                print("error")
            }
        }
        
        btnCount.isEnabled = false
        btnExplosion.isEnabled = true
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
            self.btnExplosion.isUserInteractionEnabled = true
            self.btnExplosion.onClick = {
                    // ここではボタンを押した際の処理を書かずに押すことだけを行いたい
                }
        }
    }
    
    @IBAction func btnExplosion(_ sender: Any) {
        if let soundURL = Bundle.main.url(forResource: "explosion", withExtension: "mp3") {
            do {
                player = try AVAudioPlayer(contentsOf: soundURL)
                player?.play()
            } catch {
                print("error")
            }
        }
        btnCount.isEnabled = true
        btnExplosion.isEnabled = false   
    }
}

自分で試したこと

前述のように、labelのonClickイベントを起こさせるコードは存在していたので変数名の部分だけ対象のボタンに変えました。参照したサイトは以下です。

0

1Answer

エラーメッセージが示す通り、UIButtonにonClickというメンバーは存在しないと思います。
UIButtonをコードから追加する↓こちらの記事は参考になりませんか?
https://qiita.com/siropaca/items/559f9844b4e2973301e3

参照されたサイトの内容は、UIButtonではなく、UILabelがクリックしたときの処理を書けるようにしたという内容で、これはUILabelを継承することで実現していました。

@IBDesignable class LabelButton: UILabel {
    var onClick: () -> Void = {}
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        onClick()
    }
}

ちなみに、ボタンが押された時に実行したい処理は、Storyboardかコードで、そのボタンに割り当てる必要があります。上の「該当するソースコード」だと、関数btnExplosion(_ sender: Any)がそれだと思うので、「ボタンを押すことだけを行いたい」なら、単にこの関数を呼べばいいだけかなと思います。

1

Your answer might help someone💌