Form에서 TextField가 있을 때, 스크롤 시 키보드는 감추는 예제이다. 먼저 키보드를 감추는 메서드를 View에 확장해서 쉽게 키보드를 감출 수 있게 한다. import Foundation import SwiftUI extension View { func hideKeyboard() { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } } 그리고 Form에 simultaneousGesture 수정자를 추가하고, 드래그 제스처가 발생 시 키보드를 감추는 메서드를 호출한다. var body: some View { Form { ... } .simultaneou..

현재 스크롤 뷰에 포함된 TextEditor에서 줄바꿈이 발생하면 뷰는 커지지만 스크롤이 되지 않아서 자동 스크롤이 되도록 만들어야 한다. # TextEditor의 최소 높이 설정하기 먼저 알아야 할 것은 List 또는 ScrollView 안에 TextEditor를 넣으면 TextEditor의 높이는 최소가 된다. 그래서 frame으로 minHeight를 설정해야 한다. # TextEditor 크기를 구하는 방법 아직은 TextEditor의 크기를 얻는 메서드가 제공되지 않는다. 그래서 bacoground에 HStack같이 확장되는 뷰를 넣고 GeometryReader로 HStack의 사이즈를 측정하면 TextEditor의 크기를 얻을 수 있다. 다음은 TextEditor의 크기를 구하는 간단한 Swif..
#available()을 사용해서 특정 버전 이상에 실행할 API를 작성하고, 그 이하는 else 에 추가하면 된다. 만일 이하에 적용할 코드만 있다면 #unavailable()을 사용하면 된다. 다음 코드는 TextEditor의 배경을 투명하게 만드는 예제코드이다. iOS 16부터는 .scrollContentBackground() 수정자로 배경을 숨겨서 투명하게 만들 수 있다. 하지만 그 이하 버전에는 UITextView의 속성을 수정해야 한다. init() { if #unavailable(iOS 16.0) { UITextView.appearance().backgroundColor = .clear } } body: some View { ... if #available(iOS 16.0, *) { Text..
TextEditor에는 PlaceHolder를 설정할 수 없다. 그래서 ZStack을 이용해서 TextEditor의 텍스트가 빈문자열인 경우, PlaceHolder로 사용할 Text를 보이게 하면 된다. ZStack(alignment: .topLeading) { if content.isEmpty { Text("content") .padding(7) .foregroundColor(Color(uiColor: .placeholderText)) } else { EmptyView() } TextEditor(text: $content) }
# 개요 - 사용자 알림(User Notifications)은 앱의 실행 여부에 관계 없이 앱 사용자에게 중요한 정보를 전달한다. - 또한 알림은 앱에 정보를 다운로드하고 인터페이스 업데이트하도록 지시할 수도 있다. - 알림은 로컬에서 생성하거나 서버에서 원격으로 생성할 수 있다. - 여기서는 로컬에서 생성하는 알림에 대해서 알아보겠다. # 알림 사용 권한 얻기 - 알림을 사용하기 위해선 앱 사용자에게 권한을 얻어야 한다. - 알림 권한을 얻는 방법은 2가지가 있다. 1. 상황에 맞게 명시적으로 권한 요청하기 2. 임시 승인을 사용하여 평가판 알림 보내기 # 상황에 맞게 명시적으로 권한 요청하기 - 권한을 요청하려면 UNUserNotificationsCenter 인스턴스를 가져와 Authorization..
다음과 같이 FetchedResults를 프로퍼티로 가지는 뷰를 만들었다. 하지만 도저히 미리보기에서 FetchedResults를 만드는 방법이 떠오르지 않았다. struct ItemsView: View { var items: FetchedResults .... } struct ItemsView_preview: PreviewProvider { static var previews: some View { ItemsView(items: ?????) .environment(\.managedObjectContext, viewContext) } } 내가 가진 모든 지식을 사용해서 FetchedResults를 만들어 보았지만 실패하고 말았다. 구글링을 통해서 얻은 방법은 두 가지가 있었다. https://stacko..

CoreData는 실행 취소와 다시 실행을 지원한다. 이와 관련된 메서드는 NSManagedObjectContext에 포함되어 있다. 컨텍스트란? NSManagedObjectContext는 CoreData의 컨텍스트를 의미한다. 컨텍스트는 실제 저장소의 데이터가 아닌 저장소의 데이터를 불러와(fetch) 임시로 메모리에 올려서 사용하는 장소라고 생각하면된다. 따라서 컨텍스트에 데이터를 추가하거나 저장소에서 불러온 데이터를 수정하고 삭제하여도 실제 저장소에 영향을 주지 않는다. save()를 호출해야 컨텍스트의 내용이 실제 저장소에 반영된다. 실행 취소와 다시 실행 관련 메서드 컨텍스트에는 실행 취소와 다시 실행과 관련하여 다음 메서드를 제공한다. undo() : 실행을 취소한다. (save도 취소할 수 ..
SwiftUI에서 if 문을 이용해서 뷰를 보이거나 숨길 수 있다. 나는 VStack에서 두 개의 if문을 사용하니 다음과 같은 에러가 발생했다. the compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions if 문이 하나일 때는 문제가 없는데, 두 개가 되니 문제가 발생했다. 해당 문제를 해결하기 위해서 여러 삽질 끝에 조건이 거짓인 경우에는 EmptyView()를 사용하는 것으로 하니 해결되었다. 심지어 이렇게 코드를 고치고 나니 미리 보기 로딩도 빨라졌다. 앞으로는 무조건 if문 사용 시 else에 EmptyView()를 ..