- 개발 일자 : 2022. 2. 4
알람 레이블 옵션 기능 추가하기~
방식은 사운드 옵션 화면과 거의 유사하다
- 일단 레이블 화면(AlarmLabelVC)을 만들어 줌
- Segue 연결도 해주고 이름은 AlarmLabelSegue 라고 했음
- AlarmDetailVC 에서 해당 segue 를 위해 prepare 함수에 해야할 일을 추가해줬고 해당 셀이 선택될 때 연결된 segue 를 실행하도록 추가하였음
(나중에 각각 상수값들은 따로 정의해야할 것 같다)
- if~else 구문보다 switch 문이 깔끔할 것 같아서 구조도 변경해주었음
- Alarm 구조체에 label 프로퍼티를 추가해서 viewDidLoad() 에서 configure() 할 때 전달된 값을 alarmOptions 항목에 적용하도록 수정하였음
private func configure() {
alarmOptions[0][1].content = alarm.label
alarmOptions[0][2].content = alarmManager.getSoundTitle(at: alarm.soundIndexPath)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.identifier {
case "AlarmLabelSegue":
let alarmLabelVC = segue.destination as? AlarmLabelViewController
alarmLabelVC?.delegate = self
alarmLabelVC?.label = alarm.label
...
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
...
switch indexPath.row {
case 1:
self.performSegue(withIdentifier: "AlarmLabelSegue", sender: nil)
case 2:
self.performSegue(withIdentifier: "AlarmSoundSegue", sender: nil)
default:
break
}
}
- AlarmLabelVC 에 label 프로퍼티를 하나 추가했고 이전에 AlarmOptionSelecting 프로토콜 타입을 갖는 delegate 프로퍼티를 추가해주었음
- 화면이 전환될 때 받아온 label 값을 바로 적용하도록 해주었고
- 키보드가 바로 올라올 수 있도록 firstResponder 설정을 해주었음
- 스토리보드 상에서 해당 텍스트필드에 대해 작성 시 clear 버튼이 뜨도록 하였고, 키보드의 return 값을 done 으로 변경해주었음
- label 화면이 사라질 때, 작성된 label 값을 AlarmDetailVC 에 전달하도록 하였음
- 기존 AlarmOptionSelecting 프로토콜에 alarmLabelTyped(label:) 메서드를 추가함
(나중에 프로토콜 정의 위치를 옮기기)
var label = "알람"
weak var delegate: AlarmOptionSelecting?
override func viewDidLoad() {
super.viewDidLoad()
labelTextField.text = label
labelTextField.becomeFirstResponder()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
delegate?.alarmLabelTyped(as: labelTextField.text ?? "알람")
}
- AlarmDetailVC 에서도 새로 추가된 AlarmOptionSelecting 의 메서드에 대해 구현 내용을 추가함
- 첨에 실행할 때 적용이 안되길래 뭐지 싶었는데 alarmLabelVC.delegate 설정을 안했던 것,,,
func alarmLabelTyped(as label: String) {
alarm.label = label
alarmOptions[0][1].content = label
let indexPath = IndexPath(row: 1, section: 0)
alarmOptionTableView.reloadRows(at: [indexPath], with: .automatic)
}
- AlarmManager 에서 notification 설정할 때도 기본 메시지가 아닌 지정한 레이블 값을 body 에 적용하도록 수정
해결 못 한 것 (해결 완료!!)
- 키보드에서 return 키를 눌렀을 때, 이전 화면으로 돌리려고 했는데
- 그래서 UITextFieldDelegate 도 추가했는데,,
- textFieldShouldReturn() 에서 dismiss 하니까 상세화면이 아니라 목록 화면으로 돌아가버림 ㅜㅜ
- 뭔가 다른 방법을 써야하는 건가 싶음
'# iOS | Swift > --- Project' 카테고리의 다른 글
[Alarm] 2. 알람 섹션 분리 및 정렬 (0) | 2022.03.02 |
---|---|
[Alarm] #+4. 알람 끄기 화면 구현 (0) | 2022.02.25 |
[Alarm] 1. 기본 알람 목록 및 추가화면 구현, AlarmManager, 삭제 기능 추가 (0) | 2022.02.25 |
[Alarm] #+2. 상세 화면에서 알람 삭제 기능 및 알람 시간 텍스트 표시 수정 (0) | 2022.02.03 |
[Alarm] #+1. 알람 편집 모드 구현 (0) | 2022.02.03 |