# iOS | Swift/--- Project

[Alarm] #+3. 알람 레이블 화면 추가

jiniz.ll 2022. 2. 25. 21:00
  • 개발 일자 : 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 하니까 상세화면이 아니라 목록 화면으로 돌아가버림 ㅜㅜ
  • 뭔가 다른 방법을 써야하는 건가 싶음