钢琴app

tag和AVFoundation

storyboard上布局:web

stack view上捆绑7个按钮,更改如下三个属性:
在这里插入图片描述
调整每一个按钮的tag属性:
在这里插入图片描述数组

把每一个按钮托在一个IBAction里面
效果:
在这里插入图片描述ide

建立播放器:svg

import UIKit
import AVFoundation
   class ViewController: UIViewController {
    var player: AVAudioPlayer!; //player至关于一个CD机,里面不知道有没有CD因此是option类型
    @IBAction func soundsButton(_ sender: UIButton) {
    }
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

建立一个保存全部声音的sounds字符串数组,配合tag实现声音的调用函数

class ViewController: UIViewController {
    var player: AVAudioPlayer!;
    var sounds = ["note1","note2","note3","note4","note5","note6","note7"];
    @IBAction func soundsButton(_ sender: UIButton) {
        play(tag: sender.tag);//这里的sender就是被按下的Button自己
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    func play(tag:Int) {
        let url = Bundle.main.url(forResource: sounds[tag], withExtension: "wav")
        //经过Bundle.main.url找到声音的路径,至关于找到一张CD
        do{
            player = try AVAudioPlayer(contentsOf: url!);//尝试将CD放进CD机内
            player.play()//运行CD机
        }catch{
            print(error)
        }
    }

}

最后完成的代码布局

import UIKit
import AVFoundation


//做用域--scope--在大括号里面定义的变量,出了大括号是无法使用的
class ViewController: UIViewController{

    var player:AVAudioPlayer!//建立一个播放器(相似于CD机)
    let sounds = ["note1","note2","note3","note4","note5","note6","note7"]//全局变量
    
    //页面加载时执行
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    //用户按下按钮时执行
    @IBAction func notePressed(_ sender: UIButton) {

        play(tag:sender.tag)//调用函数
        
    }
    
    //建立一个发出声音的功能函数
    func play(tag: Int){
        //找到音频文件(相似于拿出一张CD光盘)-局部变量
        let url = Bundle.main.url(forResource: sounds[tag-1], withExtension: "wav")
        
        do{
            player = try AVAudioPlayer(contentsOf: url!)//在CD机里面放入CD光盘
            player.play()//按下播放按钮
        }catch{
            print(error)//放入的CD光盘可能有损坏致使CD机读不出来,咱们须要用docatch来捕捉可能的错误,防止App闪退
        }
    }
  
}