본문 바로가기

프로젝트

(79)
18. 기능 구현 #6 기능 구현 #6 트윗 작성 트윗 작성 | NewTweetView struct NewTweetView: View { @State private var caption = "" @Environment(\.dismiss) var dismiss var body: some View { VStack { HStack { Button { dismiss() } label: { Text("Cancel") .foregroundColor(Color(.systemBlue)) } Spacer() Button { print("tweet") } label: { Text("Tweet") .bold() .foregroundColor(.white) .padding(.horizontal) .padding(.vertical, 8) .backg..
17. 기능 구현 #5 기능 구현 #5 유저 검색 기능 유저 검색 기능 | SearchBar 29. List의 부가 기능 구현하기 List의 부가 기능 구현하기 Pull Refresh Apple Developer Documentation developer.apple.com 화면을 아래로 끌어당겨 새로고침 하는 iOS의 가장 보편적인 새로고침 방식이다. struct PullToRefresh: View { @State private var ite chillog.page SwiftUI에서도 SearchBar를 제공하지만 List나 NavigationView 등 특정 View만 지원하므로 심미적인 목적이나 구현 스타일에 따라 새롭게 구성할 수 있어야 한다. struct SearchBar: View { @Binding var text:..
16. 코드 가독성 개선 코드 가독성 개선 UserService UserService > fetchUsers func fetchUsers(completion: @escaping([User]) -> Void) { var users = [User]() Firestore.firestore().collection("users").getDocuments { snapshot, _ in guard let documents = snapshot?.documents else { return } documents.forEach { document in guard let user = try? document.data(as: User.self) else { return } users.append(user) } completion(users) } } f..
15. 기능구현 #4 기능구현 #4 ExploreView ExploreView | UserService > fetchUser struct UserService { func fetchUser(withUid uid: String, completion: @escaping(User) -> Void) { Firestore.firestore().collection("users").document(uid).getDocument { snapshot, _ in guard let snapshot = snapshot else { return } guard let user = try? snapshot.data(as: User.self) else { return } completion(user) } } } UserService는 현재 fetchUs..
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(..
13. DB와 연결하기 #2 DB와 연결하기 #2 프로필 사진 표시하기 프로필 사진 표시하기 | Kingfisher import 하기 Kingfisher GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web. A lightweight, pure-Swift library for downloading and caching images from the web. - GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web. github.com URL을 사용해..
12. DB와 연결하기 #1 DB와 연결하기 #1 Link UserData to SideMenu Link UserData to SideMenu | AuthViewModel class AuthViewModel: ObservableObject { @Published var userSession: FirebaseAuth.User? @Published var didAuthenticateUser = false @Published var currentUser: User? private var tempUserSession: FirebaseAuth.User? private let service = UserService() init() { self.userSession = Auth.auth().currentUser fetchUser() } 현재 접..
05. 인터페이스 디자인 #2 인터페이스 디자인 #2 앱 설정, 디자인 다듬기 앱 설정 기기의 모든 상태에 대처할 수 있다면 더할 나위 없이 좋겠지만, 가진이 없다면 예상이 되는 상황은 미리 차단하는 것도 방법이다. 앱 설정 | 화면 방향 고정하기 인터페이스를 디자인할 때 offset 등의 고정값을 사용하지 않았기 때문에 큰 문제는 없지만, 이렇게 화면의 방향이 바뀌면 서로의 영역을 침범하는 문제가 생긴다. 따라서 이 앱에서는 Portrait 모드만 지원하도록 앱의 Deployment Info를 변경한다. 이제부터 이 앱은 iPhone의 Portrait 모드 상태로만 제공된다. 앱 설정 | 화면 모드 고정하기 애플은 iOS13부터 darkmode를 지원하기 시작했다. 기본으로 제공하는 API에는 대비가 돼있어 크게 신경 쓸 부분은 없..
04. 기능구현 #3 기능구현 #3 이미지 저장 이미지 저장 | 저장 기능 이미지를 생성하다 마음에 들면 앨범에 저장해 공유할 수 있도록 기능을 구현한다. .toolbar { ToolbarItem(placement: .navigationBarLeading) { NavigationLink { InfoView() } label: { Image(systemName: "info.circle") } } ToolbarItem(placement: .navigationBarTrailing) { Button { //share } label: { Image(systemName: "square.and.arrow.up") } } } 앞서 생성한 ToolbarItem에 기능을 추가한다. .toolbar { ToolbarItem(placement: ..
03. 기능구현 #2 기능구현 #2 이미지 표시하기 이미지 표시하기 | ContentView > Button struct ContentView: View { @ObservedObject var viewModel = ViewModel() @State var image: UIImage? @State var text = "" var body: some View { NavigationView { VStack { Spacer() 앞서 초기화 한 ViewModel을 사용하기 위해 ObsevedObject로 viewMocdel 인스턴스를 생성한다. var body: some View { NavigationView { VStack { Spacer() if let image = image { Image(uiImage: image) .resi..