iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
Mobile Development

少年K的Swift奇幻漂流記系列 第 28

Day28 Swift Clock App 實作 Part 8:選擇鈴聲畫面

  • 分享至 

  • xImage
  •  

在這篇教學中,我們將實作 Swift 鬧鐘應用的「選擇鈴聲」畫面。當用戶設定鬧鐘時,能夠從預設的提示聲中選擇自己喜歡的鈴聲,並能夠即時預覽該鈴聲。本文將介紹如何使用 UITableView 顯示可選的鈴聲列表,並利用 AVAudioPlayer 播放選中的鈴聲。

1. 設定 SoundViewController

我們將建立 SoundViewController,該頁面包含一個 UITableView,來顯示可供選擇的鈴聲列表。當用戶選擇鈴聲後,將會播放預覽聲音,並透過代理傳遞選擇結果回到上一頁。

import UIKit
import AVFoundation

protocol SoundViewControllerDelegate: AnyObject {
    func didSelectSound(_ soundName: String)
}

class SoundViewController: UIViewController {
    
    // MARK: - IBOutlet
    @IBOutlet weak var tableView: UITableView!
    
    // MARK: - Property
    weak var delegate: SoundViewControllerDelegate?
    let sounds = ["馬林巴琴", "鬼畜", "雷達", "sunkis trust me", "Huu"]
    var selectedSoundIndex: Int = 0
    var audioPlayer: AVAudioPlayer?
    var currentSelectedSound: String?
    
    // MARK: - LifeCycle
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
        if let currentSound = currentSelectedSound,
           let index = sounds.firstIndex(of: currentSound) {
            selectedSoundIndex = index
        }
    }
}

1.1 變數與屬性

  • sounds: 存放可供選擇的鈴聲名稱。
  • selectedSoundIndex: 記錄目前選中的鈴聲索引,以便在畫面中顯示選中的狀態。
  • audioPlayer: 用來播放選中鈴聲的音頻播放器。
  • delegate: 用來回傳選中鈴聲的代理。

當頁面載入時,我們會根據用戶之前選擇的鈴聲來初始化 selectedSoundIndex,以便顯示當前選擇的鈴聲。

2. 界面配置與完成按鈕

我們在 setupUI() 方法中設定頁面的標題、註冊 UITableViewCell 並指定 UITableViewdelegatedataSource。另外,我們還在導航欄中加入「完成」按鈕,當用戶選擇好鈴聲後,可以透過此按鈕完成操作並回到上一頁。

// MARK: - UI Settings

func setupUI() {
    title = "提示聲"
    tableView.register(UINib(nibName: "SoundTableViewCell", bundle: nil), forCellReuseIdentifier: SoundTableViewCell.identifier)
    tableView.delegate = self
    tableView.dataSource = self
    
    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "完成", style: .plain, target: self, action: #selector(doneTapped))
}

2.1 完成按鈕動作

當用戶選擇完鈴聲後,點擊「完成」按鈕將觸發 doneTapped(),該方法會將用戶選中的鈴聲名稱透過代理傳遞給前一個頁面,並關閉 SoundViewController

// MARK: - IBAction

@objc func doneTapped() {
    delegate?.didSelectSound(sounds[selectedSoundIndex])
    navigationController?.popViewController(animated: true)
}

3. UITableView 的設置

為了讓用戶從鈴聲列表中進行選擇,我們使用 UITableView 來展示可供選擇的鈴聲名稱。每當用戶選擇一個鈴聲時,會播放對應的鈴聲並在畫面上顯示選中的狀態(checkmark)。

// MARK: - Extensions

extension SoundViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sounds.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SoundTableViewCell", for: indexPath) as! SoundTableViewCell
        cell.lbTest.text = sounds[indexPath.row]
        cell.accessoryType = indexPath.row == selectedSoundIndex ? .checkmark : .none
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        selectedSoundIndex = indexPath.row
        tableView.reloadData()
        playSound(named: sounds[indexPath.row])
    }
}

3.1 主要功能說明

  • numberOfRowsInSection: 回傳鈴聲數量,告訴 UITableView 需要顯示多少行。
  • cellForRowAt: 設定每個單元格顯示的鈴聲名稱,並根據 selectedSoundIndex 來顯示是否被選中(用 checkmark 標示)。
  • didSelectRowAt: 當用戶點擊某個單元格時,會更新 selectedSoundIndex,播放選中的鈴聲,並即時更新畫面。

4. 播放鈴聲

每當用戶選擇不同的鈴聲時,會透過 playSound(named:) 方法播放對應的音效。該方法會使用 AVAudioPlayer 播放 .mp3 格式的鈴聲,並在 Bundle 中查找該檔案。

// MARK: - Function

func playSound(named name: String) {
    guard let url = Bundle.main.url(forResource: name, withExtension: "mp3") else { return }
    
    do {
        audioPlayer = try AVAudioPlayer(contentsOf: url)
        audioPlayer?.play()
    } catch {
        print("無法播放音效: \(error.localizedDescription)")
    }
}

4.1 播放失敗處理

如果找不到指定的音檔,或播放過程中出現錯誤,我們會在控制台顯示錯誤訊息,幫助開發者追蹤問題。

5. 總結

在這篇文章中,我們實現了 Swift 鬧鐘應用的「選擇鈴聲」功能,用戶可以從預設的鈴聲列表中選擇自己喜歡的提示聲,並能夠即時預覽。此功能透過 UITableView 顯示鈴聲名稱,並使用 AVAudioPlayer 播放音效,為應用帶來更加直觀的用戶體驗。

接下來,您可以將選擇的鈴聲與鬧鐘設定整合,讓用戶能夠儲存選中的鈴聲並在鬧鐘響起時播放。


上一篇
Day27 Swift Clock App 實作 Part 7:重複天數畫面
下一篇
Day 29 Swift 藍牙應用實作 Part 1 – 建立藍牙服務的 Swift 檔案
系列文
少年K的Swift奇幻漂流記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言