[Project 일지] 여행 기록 앱 만들기 (12) - 2.0 버전 업데이트 진행(UI 수정 및 디테일 보완, 오류 수정)

1차 앱 승인 이후 DetailView의 UI를 변경하고 이전에 놓쳤던 오류 및 구현을 모두 마무리하고 2차 업데이트 심사를 넣는 것을 마무리로 최종 프로젝트가 거의 마무리 되었다.

이후 유저 이벤트를 진행할 예정이며 이 내용을 바탕으로 부족한 점이나 수정해야할 점을 업데이트 해 나갈 예정이다.

 

UI 수정한 내용은 이전 포스팅에서 다뤘으니 이번에는 추가적으로 수정했던 오류 및 구현에 대해서 기록하고자 한다.

 

지출 페이지 내 삭제 이후 데이터 적용

지출 페이지 내 지출 데이터를 삭제 한 이후 데이터가 firebase 내 정상적으로 삭제되는 점을 확인했으나, 삭제 이후 다시 지출 페이지를 확인하는 페이지로 가면 이전에 한번 데이터를 불러온 값이 유지되어 삭제된 데이터가 사라지지 않는 문제가 있었다.

 

원인을 파악해 보자면 firebase에서 변경된 데이터를 가져와서 값을 맞게 변경해주어야 하는데 한번만 데이터를 불러오게 되면서 SpendingVC에서 변경된 데이터를 다시 불러와 데이터를 변경해 주어야 한다.

extension DetailViewController: SpendingListViewControllerDelegate {
    func didSaveExpense(_ expense: Expense) {}
    
    func didUpdateExpenses(_ expenses: [DailyExpenses]) {
        pinLog?.expenses = expenses
        detailViewCollectionView.reloadData()
    }
}

먼저 DetailVC로 돌아올때 삭제 된 값을 다시 파이어베이스에서 불러오기 위해 viewWillDisappear 메서드에서 delegate 메서드를 호출해 데이터를 전달하는 방식을 추가해 주었다.

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    
    if self.isMovingFromParent {
        delegate?.didUpdateExpenses(dailyExpenses)
    }
}

그 이후 viewWillDisappear 메서드 내 해당 데이터를 전달하는 방식을 구현하였다.

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .systemBackground

    configureUI()
    makeConstraints()
    updateView()
    
    tableView.dataSource = self
    tableView.delegate = self
    
    tableView.register(SpendingTableViewCell.self, forCellReuseIdentifier: "cell")
    tableView.register(SpendingTableViewHeaderView.self, forHeaderFooterViewReuseIdentifier: SpendingTableViewHeaderView.identifier)
    NotificationCenter.default.addObserver(self, selector: #selector(didReceiveNewExpenseData(_:)), name: .newExpenseData, object: nil)
    
    if let pinLog = pinLog {
        dailyExpenses = pinLog.expenses ?? []
        updateView()
    } else {
        print("No PinLog found.")
    }
    
    tableView.tableFooterView = UIView()
    
    if #available(iOS 15.0, *) {
        self.tableView.sectionHeaderTopPadding = 0.0
    }
    
    // Set delegate
    if let navigationController = self.navigationController,
       let detailViewController = navigationController.viewControllers.first(where: { $0 is DetailViewController }) as? DetailViewController {
        self.delegate = detailViewController
    }
}

그 이후 DetailVC로 넘어와

if let navigationController = self.navigationController,
   let detailViewController = navigationController.viewControllers.first(where: { $0 is DetailViewController }) as? DetailViewController {
    self.delegate = detailViewController
}

델리게이트를 선언 해주면서 SpendingVC에서 값을 제대로 전달할 수 있게 된다.

 

DetailViewController로 전달받은 값을 사용해 컬렉션 뷰를 업데이트 하게 되면 이렇게 데이터가 변경되어도 제대로 그 값이 적용되게 된다.

회원 가입되지 않은 계정 메이트 추가 검색 결과 제외

제대로 회원 가입되지 않아 닉네임 혹은 프로필 이미지를 가지고 있지 않은 회원 정보는 메이트 VC에서 메이트 추가가 되지 않도록 수정했다.

func searchFriends(with query: String) {
    guard let currentUserID = Auth.auth().currentUser?.uid else { return }
    
    // Filter by name
    let filteredByName = users.filter { $0.displayName.lowercased().contains(query.lowercased()) }
    
    // Filter by email
    let filteredByEmail: [UserSummary]
    if query.contains("@") {
        filteredByEmail = users.filter { $0.email.lowercased().contains(query.lowercased()) }
    } else {
        filteredByEmail = []
    }
    
    // Combine filtered results
    let combinedFilteredUsers = Array(Set(filteredByName + filteredByEmail))
    
    // Filter users based on additional conditions: non-empty displayName, non-empty email, non-nil photoURL
    filteredUsers = combinedFilteredUsers.filter { 
        $0.uid != currentUserID && 
        !$0.displayName.isEmpty && 
        !$0.email.isEmpty && 
        $0.photoURL != nil 
    }
    
    // Update isMate status for filtered users
    for i in 0..<filteredUsers.count {
        if addedMates.contains(where: { $0.uid == filteredUsers[i].uid }) {
            filteredUsers[i].isMate = true
        }
    }
    
    // Update no data view and reload table view
    updateNoDataView(isEmpty: filteredUsers.isEmpty)
    tableView.reloadData()
}

여러가지 검색 제약 조건 중

filteredUsers = combinedFilteredUsers.filter { 
    $0.uid != currentUserID && 
    !$0.displayName.isEmpty && 
    !$0.email.isEmpty && 
    $0.photoURL != nil 
}

이 부분에 닉네임 , 이메일 , 사진 등 확인되지 않은 회원의 정보를 검색에서 제외하는 내용을 추가해주면 정상적으로 회원가입 된 유저의 정보만 검색이 가능해진다.

 

이것으로 최종프로젝트가 거의 마무리 되었다. 이제 유저 이벤트를 진행해 여러 사용자들의 사용 후기를 받아 볼 예정이다.

 

이 내용을 바탕으로 추가적으로 업데이트를 진행할 예정이다.