struct MusicModel {
let id = UUID()
var name: String
var filename: String
var isSelected: Bool
static func defaultMusic() -> MusicModel {
return MusicModel(name: "무음", filename: "", isSelected: true)
}
}
주요 특징:
protocol MusicSelectViewControllerDelegate: AnyObject {
func didSelectMusic(_ music: MusicModel)
}
class MusicSelectViewController: UIViewController {
weak var delegate: MusicSelectViewControllerDelegate?
private var audioPlayer: AVAudioPlayer?
private var currentSelectedMusic: MusicModel?
private var musicList: [MusicModel] = []
// UI Components...
}
주요 특징:
TimerView의 구조를 다음과 같이 개선하였다:
// 레이블 관련 컴포넌트
private let labelContainerView = UIView()
private let labelTextLabel = UILabel()
private let nameTextField = UITextField()
// 음악 관련 컴포넌트
private let musicContainerView = UIView()
private let selectedMusicLabel = UILabel()
private let timerEndButton = UIButton()
private lazy var tableView: UITableView = {
let table = UITableView()
table.backgroundColor = .clear
table.register(UITableViewCell.self, forCellReuseIdentifier: "MusicCell")
return table
}()
private func setupUI() {
view.backgroundColor = .black
// 컴포넌트 추가 및 제약조건 설정
view.addSubview(cancelButton)
view.addSubview(settingButton)
view.addSubview(tableView)
view.addSubview(silentButton)
// Constraints 설정...
}
주요 구현 내용:
private func playMusic(_ music: MusicModel) {
print("재생 시도: \(music.name)")
audioPlayer?.stop()
guard let path = Bundle.main.path(forResource: music.name, ofType: "mp3") else {
print("음악 파일을 찾을 수 없습니다: \(music.name)")
return
}
let url = URL(fileURLWithPath: path)
do {
try AVAudioSession.sharedInstance().setCategory(.playback)
try AVAudioSession.sharedInstance().setActive(true)
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.prepareToPlay()
audioPlayer?.play()
print("재생 시작됨")
} catch {
print("음악 재생 실패: \(error.localizedDescription)")
}
}
주요 구현 내용:
extension MusicSelectViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let selectedMusic = musicList[indexPath.row]
currentSelectedMusic = selectedMusic
playMusic(selectedMusic)
// 체크마크 업데이트
musicList.indices.forEach { index in
musicList[index].isSelected = (index == indexPath.row)
}
tableView.reloadData()
}
}
// MARK: - Properties
// MARK: - Lifecycle Methods
// MARK: - UI Configuration
// MARK: - Private Methods
// MARK: - Button Actions