분류 전체보기 29

WebView 사용하기 (2) - WKWebView

SFSafariWebViewController를 사용하는 방법을 알아보았는데, 이어서 App 내에서 직접 웹 페이지를 로드하고, JavaScript 실행 및 커스텀 웹 컨트롤을 구현할 수 있는 웹 뷰인 WKWebView에 대해 정리하겠습니다.Apple의 WebKit 프레임워크에서 제공하며, UIWebView의 후속 버전으로 성능과 보안이 크게 개선되었습니다. 📌 WKWebView의 주요 특징앱 내에서 완전한 웹 브라우징 가능WKWebView는 웹 페이지를 로드하고, JavaScript 실행 및 CSS 적용이 가능하여 맞춤형 브라우저를 만들 수 있음.JavaScript 실행 및 DOM 조작 가능evaluateJavaScript(_:completionHandler:)를 사용하여 JavaScript 코드를 ..

카테고리 없음 2025.02.25

WebView 사용하기 (1) - SFSafariViewController

앱에서 웹 페이지를 보여줘야 할 때 WebView를 사용하죠.iOS에서 사용할 수 있는 방법이 크게 3가지 있는데요, 그 중 첫 번째로 SFSafariViewController를 사용하는 방법을 소개하겠습니다.  SFSafariViewController는 앱 내에서 웹 콘텐츠를 표시할 때 사용하는 기본 웹 브라우저 컨트롤러입니다. 사용자는 앱을 종료하지 않고도 웹 페이지를 볼 수 있으며, Safari의 자동 로그인, 콘텐츠 차단, 키체인, 공유 확장 기능 등의 기능을 활용할 수 있습니다.  📌 SFSafariViewController의 주요 특징Safari의 기능 제공Safari에서 제공하는 보안, 쿠키 공유, 자동 로그인, 키체인 등의 기능을 그대로 사용할 수 있음.앱 내 웹 브라우징 지원웹뷰를 별도..

카테고리 없음 2025.02.24

SwiftUI: Form을 활용한 입력 폼 제작하기

SwiftUI에서 사용자 입력을 받는 UI를 만들 때 Form을 활용하면 손쉽게 구조화된 입력 폼을 생성할 수 있습니다. Form은 설정 화면이나 회원가입 폼, 프로필 편집 화면 등에서 많이 사용됩니다. 이 글에서는 Form의 기본 개념부터 다양한 입력 요소(TextField, Toggle, Picker 등)를 활용하는 방법까지 상세히 알아보겠습니다.1️⃣ Form이란? SwiftUI의 Form은 정리된 형태의 입력 UI를 쉽게 구성할 수 있도록 도와주는 컨테이너입니다.UIKit의 UITableView 스타일과 유사하며, 섹션 단위로 그룹화하여 구성할 수 있는 것이 특징입니다. 📌 주요 특징:Form 내부에 다양한 입력 요소(TextField, Toggle, Picker 등)를 배치할 수 있음자동으로 ..

카테고리 없음 2025.02.20

SwiftUI에서 ForEach와 Identifiable 프로토콜 활용하기

SwiftUI에서 ForEach와 Identifiable 프로토콜 활용하기 ✅ SwiftUI에서 리스트를 다룰 때 필수적인 ForEach와 Identifiable SwiftUI에서는 ForEach와 Identifiable 프로토콜을 활용하여 반복적인 UI 요소를 효율적으로 만들 수 있습니다. 특히, List나 VStack, HStack 등에서 여러 개의 데이터를 표시할 때 유용합니다. 이 글에서는 ForEach와 Identifiable 프로토콜의 개념과 활용 방법을 자세히 설명하겠습니다.1️⃣ ForEach란 무엇인가? ForEach는 SwiftUI에서 반복적으로 뷰를 생성하는 데 사용되는 구조체입니다. Swift의 for-in 루프처럼 동작하지만, SwiftUI의 선언형 문법에 맞게 설계되었습니다. ?..

카테고리 없음 2025.02.20

WKWebView를 사용하면서 발생하는 Memory Leaks 해결법

🔴 오류WKWebView를 사용한 객체가 메모리에서 해제되지 않고 남아 Memory Leaks 발생 🔍 원인WKUserContentController가 WKScriptMessageHandler를 강하게 참조(strong reference)하기 때문 🛠 해결 방법1. WKScriptMessageHandler를 핸들러에서 제거한다. - UIKitoverride func viewDidDisappear(_ animated: Bool) { ... popupWebView = nil contentController.removeScriptMessageHandler(forName: "handler")} viewDidDisappear에서 removeScriptMessageHandler 메서드 호출 - Swift..

카테고리 없음 2025.02.18

SwiftUI: 중복 Navigation 호출 오류

🛑 오류 메시지 🔍 원인해당 오류는 한 프레임 내에서 내비게이션 이동이 여러 번 호출될 때 발생한다.- 동일한 내비게이션 명령이 중복으로 실행됨.- 버튼이 짧은 시간에 빠르게 여러 번 입력되어 중복된 호출 발생.🛠 해결 방법1. 플래그를 활용한 중복 방지화면 이동 중을 나타내는 변수를 사용하여 중복 호출을 방지하는 방법@State private var isNavigating: Bool = false  2. 유예기간 적용적당한 처리 시간을 주고(예: 0.5초) 연속적인 이벤트를 제한하여 이벤트 중복 수신을 방지하는 방법debounce나 throttle을 적용하여 처리할 수도 있다.  🧐 더 간단한 방법은 없나요..?NavigationStack을 관리하는 클래스에서 중복된 View일 경우 Push하지..

카테고리 없음 2025.02.17

SwiftUI: TabView Style 사용하기

SwiftUI의 TabView는 tabViewStyle(_:)을 사용하여 다양한 스타일을 적용할 수 있습니다. 공식 문서에서 제공하는 TabViewStyle의 종류와 특징을 알아봅시다! automatic시스템이 자동으로 적절한 스타일을 적용합니다.기본적으로 tabBarOnly 스타일을 사용하지만, 특정 상황에서는 page 스타일이 적용될 수 있습니다.플랫폼과 컨텍스트(예: iOS, iPadOS, macOS)에 따라 달라질 수 있습니다.플랫폼에 따라 다른 스타일을 사용하지만, iOS 에서는 기본적으로 Tab bars를, iPadOS와 macOS에서는 Tab views를 사용합니다. tabBarOnly하단 탭바를 표시하는 기본적인 TabView 스타일입니다.iOS에서 기본값.하단에 UITabBar처럼 탭바가..

카테고리 없음 2025.02.13

@FocusState: SwiftUI에서 포커스 관리하는 방법

SwiftUI에서 FocusState는 텍스트 필드와 같은 입력 요소의 포커스를 관리하는 데 사용되는 프로퍼티 래퍼입니다. @FocusState를 사용하면 특정 필드가 포커스를 가졌는지 여부를 바인딩하여 제어할 수 있습니다.기본 사용 방법다음은 FocusState를 활용하여 텍스트 필드의 포커스를 관리하는 간단한 예제입니다.import SwiftUIstruct FocusStateExampleView: View { @FocusState private var isFocused: Bool @State private var text: String = "" var body: some View { VStack { TextField("Enter text", te..

카테고리 없음 2025.02.12

SwiftUI에서 컨텐츠 길이에 따른 스크롤링 적용하기

SwiftUI를 사용하여 UI를 구성할 때, 컨텐츠의 길이에 따라 스크롤이 필요하거나 필요하지 않은 상황을 처리해야 할 때가 있습니다. iOS 16.4 이상에서는 간단한 방법으로 이를 구현할 수 있지만, 하위 버전에서는 기존 SwiftUI 기능을 활용해 직접 구현해야 합니다.iOS 16.4 이상: .scrollBounceBehavior(.basedOnSize) 사용하기iOS 16.4부터 Apple은 .scrollBounceBehavior라는 새로운 modifier를 도입했습니다. 이 modifier는 스크롤 뷰의 바운스 동작을 컨텐츠 크기에 따라 동적으로 조정할 수 있도록 도와줍니다. 이를 활용하면 컨텐츠의 길이가 스크롤 뷰의 크기보다 짧은 경우 바운스 효과를 비활성화하고, 그렇지 않은 경우 활성화하는 ..

카테고리 없음 2025.02.10

Refreshable: 당겨서 새로고침 적용하기

UIKit에서의 UIRefreshControl이 있다면 SwiftUI에서는 refreshable 수정자를 통해 쉽게 처리할 수 있습니다.  사용법 refreshable 적용:refreshable 모디파이어는 List나 ScrollView와 같은 스크롤 가능한 뷰에 적용할 수 있습니다. 사용자가 뷰를 아래로 당길 때 실행할 비동기 작업을 정의합니다.import SwiftUIstruct ContentView: View { @State private var items = ["Item 1", "Item 2", "Item 3"] var body: some View { List(items, id: \.self) { item in Text(item) } ..

카테고리 없음 2025.02.05