본문 바로가기

2022/10

(23)
23. State & Binding UIKit SwiftUI UIKit과 SwiftUI의 가장 큰 차이점은 View(UI)를 직접 업데이트하지 않는다는 점이다. SwiftUI에서 View는 상태(State)에 자동으로 반응한다. 이러한 상태를 나타내는 변수를 Property Wrapper 라고 부르며 자주 사용되는 것들은 다음과 같다. State Binding Environment ObservedObject EnvironmentObject StateObject All SwiftUI property wrappers explained and compared - a free SwiftUI by Example tutorial Was this page useful? Let us know! 1 2 3 4 5 www.hackingwithswift.co..
22. NavigationView & TabView NavigationView Apple Developer Documentation developer.apple.com 정리하는 시점에는 이미 사용이 중단돼 NavigationStack으로 대체됐다. NavigationStack Apple Developer Documentation developer.apple.com 대부분의 modifier는 그대로 사용할 수 있으니 글은 NavigationView를 기준으로 정리하고, 변경된 부분에 대한 설명이 필요할 경우 추가 언급하도록 한다. 앱을 사용하다 보면 아래에서 올라오는 게 아닌, 옆으로 넘어가는 전환 효과와 함께 새로운 화면을 표시하는 경우가 있다. 새로운 화면을 표시하는 과정(왼쪽)을 'Push'라고 부르고, 이전의 화면으로 돌아가는 과정(오른쪽)을 'Po..
04. 동작 검증, 더 나아가기 동작 macOS 문제없이 파일을 저장하고, 최근 사용한 파일의 목록을 불러올 수 있으며, 편집도 제대로 동작한다. iOS iOS도 마찬가지로 잘 동작한다. 더 나아가기 iOS와 macOS에서 모두 잘 동작하지만, 미관상 거슬리는 부분이 하나 있다. 바로 이 부분이다. 심지어 오른쪽 뒤로가기 버튼은 아무런 동작도 하지 않기까지 하는데, 이는 DocumentGroup과 TextEditor의 기본 UI가 겹쳐서 발생하는 문제다. struct ToyEditorApp: App { var body: some Scene { DocumentGroup(newDocument: TextFile()) { file in ContentView(document: file.$document) .toolbarRole(.automati..
03. 프로젝트 설정 변경 앱이 iOS와 맥의 저장소에 접근하기 위해 몇 가지 설정을 변경해 줘야 한다. Project > Target 프로젝트의 Target으로 이동해 'App Sandbox' 부분의 User Selected File의 권한을 'Read/Write'로 변경한다. 이 과정으로 맥에서 Finder를 사용해 기존의 파일을 읽거나 수정할 수 있고, 새 파일을 생성할 수 있다. 특히 해당 권한은 이전 Xcode 버전에서 maxOS.entitlements 파일의 'com.apple.security.files.User-selected.read-write'를 대체하는 부분이다. Project > info 프로젝트의 Target으로 이동해 info에 새로운 Key를 추가한다. 추가하는 'Support Document Browse..
에어팟 프로 2 하루치 리뷰 개봉 예약 구매 첫날 주문한 에어팟 프로 2가 오늘 도착했다. 픽업도 공식 리셀러들의 일정도 모두 21일인 와중에 애플스토어 현장 구매는 20일에 진행돼 의외의 노이즈도 있었다. 나도 21일이 공식 출시인지 알았으니까... 박스의 이미지가 두 유닛이 평행하게 위치하던 것이 오른쪽 유닛이 살짝 위에 배치된 것으로 바뀌었다. 센서의 생김새나 벤트홀의 크기도 실제로 달라졌기 때문에 반영이 됐지만 가장 눈에 띄는 차이점은 유닛의 배치다. 비닐포장 없이 변경된 씰 방식의 포장을 하고 있다. 내용물은 여러 설명서와 보증서들, 본체, C to L 케이블, 이어 팁 박스다. 늘 그렇듯 있어야 할 것들만 예쁘게도 담아 놨다. 프로 1세대와 비교해 이어팁의 측면 메쉬가 변경됐다고 한다. 미세한 차이지만 소리에 영향이 있고..
02. 구현 FileDocument Apple Developer Documentation developer.apple.com 파일을 불러올 구조체를 정의한다. struct TextFile: FileDocument { static var readableContentTypes: [UTType] init(configuration: ReadConfiguration) throws { } func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper { } } 구조체의 프로토콜은 FileDocument로 필수로 구현해야 하는 메서드와 생성자는 다음과 같다 init(configuration: Self.ReadConfiguration) throws 열기에 해당한..
01. 배경지식 UniformTypeIdentifiers 예제는 해당 모듈을 import 하는 걸로 시작한다. utf-8이나 utf-16으로 인코딩 된 파일을 읽기 위해 사용한다고 하는데 조금 자세히 알아보자. Apple Developer Documentation developer.apple.com The Uniform Type Identifiers framework provides a collection of common types that map to MIME and file types. Use these types in your project to describe the file types in your app. 해석하면 MIME과 파일 타입에 대한 형식을 제공한다는 의미이다. 아직도 모르겠으니 조금 더 찾아보자...
00. 시작하며 개인적으로 필요한 앱을 만들어 보기 위해 Finder를 호출할 일이 생겼는데, 간단한 예제 프로그램 만들기가 있어 따라하며 정리해 본다. 앱 UI 별도의 UI를 구성하진 않는다. 특이점이라면 항상 사용하던 WindowGroup이 아닌 DocumentGroup을 사용해 본다. 애플에서 제공하는 Finder와 File 앱의 API를 그대로 사용한다. 기능 FileBrowser(Finder, Files App) 호출 plaintext 파일에 대한 CRUD 참고 굉장히 간단한 샘플 코스가 있다. 내용은 간단하지만 설명이 많이 빠져있어 이를 채우며 진행할 예정이다.
05. 더 나아가기 자동 스크롤 메시지의 양이 많아한 화면에 표시하지 못하는 경우 Scroll View는 화면 밖에 새로운 메시지를 표시한다. 카톡이나 기본 메시지 앱의 경우 새 메시지가 화면 밖에 표시되면 자동으로 맨 아래로 이동하게 되는데, 이를 구현해 본다. Apple Developer Documentation developer.apple.com 원리는 간단하다. Scroll View의 scrollTo(_:anchor:) 메서드를 사용하는 것으로, 파라미터로 대상을 전달하기만 하면 된다. struct ContentView: View { @StateObject var messagesManager = MessagesManager() var body: some View { VStack { VStack { TitleRow()..
SwiftUI에서 키보드 숨기기 SwiftUI가 버전업 되면서 여러 기능이 추가되는 가운데 여전히 지원하지 않는 기능은 Responder에 관한 제어 권한이다. 별도의 변수를 생성해 이를 이용해 제어하는 경우가 많은데, 그런 거창한 거 필요 없이 해제를 하고자 하는 경우가 있다. #if canImport(UIKit) extension View { func hideKeyboard() { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } } #endif 간단하게 UIKit에 정의된 Responder 메서드를 불러와 파라미터를 전부 비워주면 responder가 해제된다. 위와 같이 별도의 함수로 선..