본문 바로가기

프로젝트/Twitter Clone App (w∕Firebase)

14. 버그 수정 #1

버그 수정 #1
Authentication, NavigationView 중복 표시 문제


Authentication
| AuthViewModel > login

before

func login(withEmail email: String, password: String) {
    Auth.auth().signIn(withEmail: email, password: password) { result, error in
        if let error = error {
            print("debug: failed to signin \(error.localizedDescription)")
            return
        }

        guard let user = result?.user else {
            return
        }
        self.userSession = user
        print("debug: did log user in")
    }
}

새로 로그인을 진행해도 이전의 로그인 정보가 남아있는 문제가 있었다.
UserSession은 교체했지만 관련된 정보를 새로 받아오지 못해서 생기는 문제로 다음과 같이 수정했다.

after

func login(withEmail email: String, password: String) {
    Auth.auth().signIn(withEmail: email, password: password) { result, error in
        if let error = error {
            print("debug: failed to signin \(error.localizedDescription)")
            return
        }

        guard let user = result?.user else {
            return
        }
        self.userSession = user
        self.fetchUser()
    }
}

이전 과정에서 해당 계정의 데이터를 받아 올 수 있도록 구현했으므로 해당 메서드를 호출해 데이터를 갱신한다.

Authentication
| AuthViewModel > uploadProfileImage

before

func uploadProfileImage(_ image: UIImage) {
    guard let uid = tempUserSession?.uid else {
        return
    }

    ImageUploader.uploadImage(image: image) { profileImageUrl in
        Firestore.firestore().collection("users").document(uid).updateData(["profileImageUrl": profileImageUrl]) { _ in
            self.userSession = self.tempUserSession
        }
    }
}

이는 계정을 생성하는 과정도 동일한 문제를 가지고 있다.

after

func uploadProfileImage(_ image: UIImage) {
    guard let uid = tempUserSession?.uid else {
        return
    }

    ImageUploader.uploadImage(image: image) { profileImageUrl in
        Firestore.firestore().collection("users").document(uid).updateData(["profileImageUrl": profileImageUrl]) { _ in
            self.userSession = self.tempUserSession
            self.fetchUser()
        }
    }
}

userSession을 업데이트 한 이후 fetchUser 메서드를 호출해 해당 계정의 데이터를 받아 올 수 있도록 수정했다.

NavigationView 중복 표시 문제
| ExploreView

before

struct ExploreView: View {
    var body: some View {
        NavigationStack {
            VStack {
                ScrollView {
                    LazyVStack {
                        ForEach(0 ... 25, id: \.self) { _ in
                            NavigationLink {
//								ProfileView(user: <#T##User#>)
                            } label: {
                                UserRowView()
                            }

                        }
                    }
                }
            }
            .navigationTitle("Explore")
            .navigationBarTitleDisplayMode(.inline)
        }
    }
}

ExploreView에 NavigationView가 중복돼 표시되는 문제가 있었다.

@main
struct twitterClone_SwiftUIApp: App {
    @StateObject var viewModel = AuthViewModel()

    init() {
        FirebaseApp.configure()
    }

    var body: some Scene {
        WindowGroup {
            NavigationView {
                ContentView()
            }
            .environmentObject(viewModel)
        }
    }
}

이는 main에 해당하는 App 파일에서 NavigationView를 사용해 ContentView를 표시하고 있기 때문에
ContentView의 하위 View가 되는 ExploreView가 NavigationView를 다시 표시하면서 발생하는 문제였다.

after

struct ExploreView: View {
    var body: some View {
        VStack {
            ScrollView {
                LazyVStack {
                    ForEach(0 ... 25, id: \.self) { _ in
                        NavigationLink {
//								ProfileView(user: <#T##User#>)
                        } label: {
                            UserRowView()
                        }

                    }
                }
            }
        }
        .navigationTitle("Explore")
        .navigationBarTitleDisplayMode(.inline)
    }
}

NavigationView만 삭제해 주면 문제는 해결 된다.

'프로젝트 > Twitter Clone App (w∕Firebase)' 카테고리의 다른 글

16. 코드 가독성 개선  (0) 2023.01.11
15. 기능구현 #4  (0) 2023.01.11
13. DB와 연결하기 #2  (0) 2023.01.10
12. DB와 연결하기 #1  (0) 2023.01.05
11. 기능 구현하기 #3  (0) 2022.12.22