# iOS | Swift/--- Project

[Alarm] #+1. 알람 편집 모드 구현

jiniz.ll 2022. 2. 3. 15:35
  • 개발 일자 : 2022. 2. 2

 

  • 이전에는 스와이프 액션을 통해 데이터가 삭제되도록 구현했었는데 왼쪽 상단 바 버튼을 편집 버튼으로 사용하기로 결정

 

  • 이전 푸시 알람 테스트로 사용했던 액션 함수명과 왼쪽 바 버튼 아이템을 편집 버튼으로 변경함
  • 또한 편집이 완료되면 완료 버튼을 누를 수 있도록 UIBarButtonItem 타입의 바 버튼을 선언했고 스토리보드에 편집 바 버튼을 outlet 으로 가져옴
  • 이 때, 일반적인 경우와 달리 weak 가 아닌 strong 참조로 가져왔는데 이는 edit 버튼이 done 버튼으로 바뀌게 되었을 때 edit 버튼이 메모리에서 해제가 되어 재사용할 수 없게 되기 때문

 

  • done 버튼을 누르게 되면 셀렉터를 통해 didTapDoneButton 함수가 실행되고
  • 이 때 done 버튼은 edit 버튼으로 교체되며
  • 알람 테이블 뷰의 편집 모드에서 나가짐

 

  • edit 버튼을 누르면 연결된 didTapEditButton 액션 함수가 실행되는데
  • 현재 저장되어 있는 알람이 없으면 실행되지 않으며
  • 왼쪽 바 버튼 아이템은 done 버튼으로 변경되고
  • 알람 테이블 뷰의 편집 모드가 활성화됨
@IBOutlet var editButton: UIBarButtonItem!
var doneButton: UIBarButtonItem?

override func viewDidLoad() {
    super.viewDidLoad()
    
    doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(didTapDoneButton))
    ...
}

@objc func didTapDoneButton() {
    navigationItem.leftBarButtonItem = editButton
    alarmTableView.setEditing(false, animated: true)
}

@IBAction func didTapEditButton(_ sender: UIBarButtonItem) {
    guard !alarmManager.isEmpty else { return }
    navigationItem.leftBarButtonItem = doneButton
    alarmTableView.setEditing(true, animated: true)
}

다른 방법으로는 왼쪽 바 버튼에 대한 액션 함수를 연결한 뒤, 테이블 뷰의 isEditing 속성을 사용해서 편집 모드 여부에 따라 적절한 행동을 하도록 구현해도 될 것

 

  • 이전에 tableView(_:trailingSwipeActionsConfigurationForRowAt:) 함수를 통해서 trailing 에 삭제 버튼을 추가했었는데
  • 아래 함수로 해당 액션과 편집 모드에서 삭제 기능을 동시에 (보다 간단하게) 만들 수 있다는 것을 최근에 알게되어
  • 이전 함수를 제거하고 아래와 같이 변경함

 

  • 모든 알람이 삭제되면 done 버튼을 누른 것과 같은 행동을 하여 편집 모드에서 나가도록 함
  • 원래는 editingStyle 에 따라 구분을 해야하는 것 같지만 tableView(_:editingStyleForRowAt:) 의 기본 반환 값이 delete 이고 현재 구현하는 것이 delete 뿐이기 때문에 바로 삭제와 관련된 처리를 해주어도 되는 듯함
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        
    alarmManager.delete(alarmRowAt: indexPath)
    tableView.deleteRows(at: [indexPath], with: .automatic)
    
    if alarmManager.isEmpty {
        didTapDoneButton()
    }
}

 

  • 위 내용을 구현하는 과정에서 알람이 하나도 없는지 체크하는 isEmpty 속성이 있으면 좋을 듯해서 AlarmManager 에 isEmpty 프로퍼티를 추가하였음
var isEmpty: Bool {
    get {
        return alarms[0].isEmpty && alarms[1].isEmpty
    }
}

 

 

참고.

UITableView 편집 모드와 관련된 속성