티스토리 뷰

728x90
반응형

firebase-modify라는 feature브랜치를 만들어줍니다 

프로젝트에서는 modify 대신 change라는 용어를 사용하고 있는데, change라는 네이밍을 사용하여 코딩해주겠습니다

 

FirebaseManager에 change함수를 추가해줍니다 수정할 메모의 키값과 새로운 메모를 받는 함수입니다 

  class func change(key: String, to memo: Memo) {
      let rootRef = Database.database().reference()
      let memoRef = rootRef.child("memos").child(key)
      memoRef.setValue(memo.toDictionary())
  }

 

수정을 누르면 이렇게 AlertViewController가 떠야하므로 textfield와 취소,확인 action을 붙인 alertcontroller를 만들고 present하는 로직을 changeAction에  추가해줍니다 

(텍스트를 다 지우고 확인을 눌렀을 경우, 삭제를 해주게 했음)

 

 

    func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let change = changeAction(at: indexPath)
        return UISwipeActionsConfiguration(actions: [change])
    }
    
    private func changeAction(at indexPath: IndexPath) -> UIContextualAction {
        let action = UIContextualAction(style: .normal, title: "수정") { [weak self] (action, view, completion) in
            guard let `self` = self else { return }
            let memo = self.viewModel.state.memos.value[indexPath.row]
            let alertController = UIAlertController(title: "메모 수정", message: nil, preferredStyle: .alert)
            alertController.addTextField(configurationHandler: { textField in
                textField.text = memo.title
            })
            let cancleAction = UIAlertAction(title: "취소", style: .cancel, handler: { [weak self] _ in
                self?.tableView.setEditing(false, animated: true)
            })
            let saveAction = UIAlertAction(title: "확인", style: .default, handler: { [weak self] _ in
                if let textField = alertController.textFields?.first, let text = textField.text {
                    if text == "" {
                        self?.viewModel.action.deleteMemo.onNext(memo)
                    } else {
                        var newMemo = memo
                        newMemo.title = text
                        self?.viewModel.action.changeMemo.onNext(newMemo)
                    }
                }
                self?.tableView.setEditing(false, animated: true)
            })
            alertController.addAction(cancleAction)
            alertController.addAction(saveAction)
            self.present(alertController, animated: true, completion: nil)
        }
        action.backgroundColor = .orange
        return action
    }

위의 코드처럼 memo의 title을 바꿀 수 있게 해주기 위해 메모구조체의 title을 var로 지정해줍니다 -! 

struct Memo {
    let ID: String
    var title: String

    init(title: String) {
        self.ID = ""
        self.title = title
    }
    
    init?(dic: [String: Any], ID: String) {
        guard let title = dic["title"] as? String else {
            return nil
        }
        
        self.ID = ID
        self.title = title
    }
}

extension Memo {
    func toDictionary() -> [String: Any] {
        return ["title": title]
    }
}

 

 

 

MemosViewModel에서 print를 빼고 change함수를 불러줍니다 

struct MemosViewModel {
    
    struct State {
        var memos: BehaviorRelay<[Memo]> = BehaviorRelay.init(value: [])
    }
    
    struct Action {
        let deleteMemo = PublishSubject<Memo>()
        let changeMemo = PublishSubject<Memo>()
    }
    
    let state = State()
    let action = Action()
    private let bag = DisposeBag()
    
    init() {
        action.deleteMemo.subscribe(onNext: { memo in
            FirebaseManager.delete(key: memo.ID)
        }).disposed(by: bag)
        
        action.changeMemo.subscribe(onNext: { memo in
            FirebaseManager.change(key: memo.ID, to: memo)
        }).disposed(by: bag)

        FirebaseManager.fetchAll()
            .bind(to: state.memos)
            .disposed(by: bag)
    }
}

 

 

돌려보면 수정기능이 잘 작동합니다 굿굿 

 

 

728x90
반응형
댓글
댓글쓰기 폼