๐ฑ iOS/SwiftUI
![[SwiftUI] @State๋ฅผ ๊ฐ์ง๋ View์ ์
๋ฐ์ดํธ](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIjQdX%2FbtrPP6KD7y9%2FplleNoV1cxDZKhm1SXHbPK%2Fimg.png)
[SwiftUI] @State๋ฅผ ๊ฐ์ง๋ View์ ์ ๋ฐ์ดํธ
์ค๋์ @State์ ๋ํด์ ์กฐ๊ธ ๋ ๊น์ด ์๊ฒ ์์๋ณด๋ ค๊ณ ํด์! ์ผ๋จ @State๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ์์ฃผ ๊ฐ๋จํ ์์ ๋ฅผ ๋ณผ๊ฒ์, ๋ชจ๋ฅด๋ฉด ์ด๊ฑฐ ๋ณด๊ณ ์ค๊ธฐ https://990427.tistory.com/64 [SwiftUI] ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ (1/5) @State ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ(data binding)์ ์ ๊ณต์์ ์๋น์๋ก๋ถํฐ ๋ฐ์ดํฐ ์๋ณธ์ ๊ฒฐํฉ์์ผ ์ด๊ฒ๋ค์ ๋๊ธฐํํ๋ ๊ธฐ๋ฒ์ด๋ค. ๋ผ๊ณ ์ํค๋ฐฑ๊ณผ๊ฐ ๋งํ๋๋ฐ, ์ฝ๊ฒ๋งํด SwiftUI์์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ view 990427.tistory.com ์๋ ์ฝ๋๋ changeItem ๋ฒํผ์ ๋๋ฌ text ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ ์์ ์ ๋๋ค struct ContentView : View { @State var text = "default" va..
![[SwiftUI] NavigationLink์ isActive ๊ณต์ ์ด์ & ํด๊ฒฐ](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbxvK0%2FbtrJ4GwuqkY%2FKVjSwYIPhLibGtzswjWso0%2Fimg.png)
[SwiftUI] NavigationLink์ isActive ๊ณต์ ์ด์ & ํด๊ฒฐ
์ฑ์ ๋ง๋ค๋ค๋ณด๋ฉด List NavigationLink๋ฅผ ๋ง๋ค์ด์ ํด๋น cell์ ํด๋ฆญํ๋ฉด ํ๋ฉด์ด ์ ํ๋๋ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. ์๋๋ NavigationLink List์ ๊ธฐ๋ณธ์ ์ธ ์ฝ๋ ์ ๋๋ค. @State var list = ["A","B","C"] var body: some View { NavigationView{ List{ ForEach(list, id:\.self){ data in NavigationLink { Text("Page Name: \(data)") // .navigationBarBackButtonHidden(true) } label: { Text("Go \(data)") } } } } } ๋ง์ฝ ์ ํ๋ ํ์ด์ง์ Back๋ฒํผ์ ์์ ๊ณ ์ปค์คํ ํ๊ณ ์ถ์ ๋๋ ์ด๋ป๊ฒ ํด์ผํ ๊น ? ์ฒซ..
![[SwiftUI] TabView ํ์ด์ง ์ด๋์ TabBar , NavigationBar Hidden ์ฒ๋ฆฌํ๊ธฐ](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz0gK6%2FbtrJGVfZASI%2FEZtOStKqysi1xHJEpi0eMK%2Fimg.png)
[SwiftUI] TabView ํ์ด์ง ์ด๋์ TabBar , NavigationBar Hidden ์ฒ๋ฆฌํ๊ธฐ
์ผ์ฃผ์ผ ์ฝ์งํ๊ณ ์์ฑํ๋ ํธ๋ฌ๋ธ์ํ .. ์ฐ์ ๋๋ TabView์์ NavigationView๋ฅผ ๋ด์ ํ์ด์ง ์ด๋์ ํ๊ณ ์ถ์๋ค. FirstView -> SecondView struct ContentView: View { var body: some View { TabView { NavigationView { FirstView() } .tabItem { Text("first") } } } } struct FirstView: View { var body: some View { ZStack{ Color.yellow VStack{ Text("FirstView") NavigationLink { SecondView() } label: { Text("Go SecondView") } } } } } struct Sec..

๋๋ฐ์ด์ค ํ๋ฉด๊ณ ์ portrait only
์ฑ์ ๋ง๋ค๋ ๊ฐ๋กํ๋ฉด์ ๊ณ ๋ คํ์ง ์๊ธฐ ์ํด landscape ๋ชจ๋๋ฅผ ์ง์ํ์ง ์๋ ๋ฐฉ๋ฒ์ ๋๋ค. UIKit๋ก ๊ตฌํํ๋ ๊ฒฝ์ฐ (Storyboard) AppDelegate.swift์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return UIInterfaceOrientationMask.portrait } SwiftUI๋ก ๊ตฌํํ๋ ๊ฒฝ์ฐ ๋๋ ํ ๋ฆฌ์ ํ๋ก์ ํธ๋ฅผ ๋๋ฅด๊ณ TARGETS์ ์๋ ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค. Info -> Supported interface orientations ์ฌ๊ธฐ์ ์ง์ํ๊ณ ์ ํ..
![[SwiftUI] Grid์์ฑ](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWkvnu%2FbtrGuS1tf4k%2F8WKrNVJNXPKK6gkfMmoQR1%2Fimg.png)
[SwiftUI] Grid์์ฑ
Grid์ ์์ฑ์ ๋ํด์ ์์ธํ ์์๋ณด์. Grid์ ์ข ๋ฅ : LazyHGrid, LazyVGrid ์์ฑ : fixed, flexible, adaptive LazyVGrid ๋ฐ์ดํฐ๋ฅผ ์์ง์ผ๋ก ๋์ดํ๊ณ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. ์์ง์ผ๋ก ๋์ดํ๊ธฐ ๋๋ฌธ์ column์ ์ฌ์ฉํฉ๋๋ค. column์ ์ธ๋ก ํ ์ค์ ์๋ฏธํฉ๋๋ค. var body: some View { LazyVGrid(columns: columns) { ForEach(0..

URLSession์ ํตํดJSON ๊ฐ์ ธ์ค๊ธฐ (2)
SwiftUI ์ด ๊ธ์ alamofire์ ๊ฐ์ ์ธ๋ถ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์์ฃผ ๊ธฐ์ด์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค! mockapi.io์์ ์ํ์ ๋ง๋ค๋ฉด ์๋์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํด ์ค๋๋ค. https://62bbeeb36b1401736cecefcf.mockapi.io/user ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํ์ต๋๋ค. struct User: Codable, Identifiable { var createdAt: String var name: String var avatar: String var id: String } json๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ฉ์ธ์ผ๋ก ์์ฑ๋๋ class๋ ์ด ์ ๊ธ๊ณผ ๋์ผํฉ๋๋ค. ๋๋ณด๊ธฐ class network { func getJSON(completion : @escaping ([User]) ->..

URLSession์ ํตํดJSON ๊ฐ์ ธ์ค๊ธฐ (1)
SwiftUI ์ด ๊ธ์ alamofire์ ๊ฐ์ ์ธ๋ถ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์์ฃผ ๊ธฐ์ด์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค! json data๋ฅผ ๊ฐ์ ธ์ฌ ์ํ๋งํฌ: https://jsonplaceholder.typicode.com/todos ์ ์ฌ์ดํธ์์ ๋ฐ์ json์ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค. Todo๊ฐ Codable, Identifiable ํ๋กํ ์ฝ์ ์ฑํํด์ผ ํ๋ค. ๊ทธ ์ด์ ๋ ๊ฐ๊ฐ Codable : JSONDecoder()์์ ์ฌ์ฉํ๊ธฐ ์ํจ Identifiable : ๋ฐ์ดํฐ๋ฅผ List์์ ๋ฆฌ์คํ ํ ๋ ์ฌ์ฉํ๊ธฐ ์ํจ struct Todo: Codable, Identifiable { var userId: Int var id: Int var title: String var completed: Bool } network.swift..
![Auto Layout 1 [Why?]](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRvM2u%2FbtrDGdtuvZg%2FcG1dkZDV5CLii8Wl7xIG9K%2Fimg.png)
Auto Layout 1 [Why?]
๐ Auto Layout ์ด๋ ? ์ ์ฝ์กฐ๊ฑด(Constraints)์ ๋ฐ๋ผ ๋ชจ๋ ๋ทฐ์ ํฌ๊ธฐ์ ์์น๋ฅผ ๋์ ์ผ๋ก ์ง์ ํ๋ ๊ฒ ์ด๊ฒ ์ ํ์ํ์ง? ๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ Frame-Base Layout์ ๋ํ ์ฌ์ ์ง์์ด ํ์ํ๋ค. Frame-Base Layout Xcode ์์์ ์ด๋ฏธ์ง View์ ํฌ๊ธฐ์ ์์น๋ฅผ ์์ ๊ฐ์ด ์ง์ ํ๊ณ Simulator๋ก ์คํ์์ผ๋ณด์. (reviewํ๋ฉด์ iPhone11๋ก ํ๊ณ , ํ๋ ์ ์ ํ์๊ฐ ๋จ๋ ์ค๊ฐ์ผ๋ก ์์น๋ฅผ ์ง์ ํ์) ์คํํ๋ฉด iPhone11์ ์์๊ฒ ์ ์ค์์ ์ ๋นํ ํฌ๊ธฐ๋ก ์ด๋ฏธ์ง๊ฐ ๋ฐฐ์น๋๋ค. ํ์ง๋ง SE๊ฐ์ ๊ฒฝ์ฐ์๋ ์ค์์ ๋ฐฐ์น ๋์ง ์๊ณ ์์น๊ฐ ์ ๋งคํ๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ฒ์๋ landscape(๊ฐ๋ก๋ชจ๋) ๋ก ๋๋ ค ๋ณด์ โ ์ด๋ฏธ์ง๊ฐ ์ค์ข ๋๋ค. ์ด์ ๋, ์ฒ์์ x์ y์ ๊ฐ์..
![[SwiftUI] ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ (1/5) @State](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxUH8T%2Fbtrs3bOd9BZ%2FozBwkioT9Hw0JsUjgfRCvk%2Fimg.png)
[SwiftUI] ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ (1/5) @State
๋ฐ์ดํฐ๋ฐ์ธ๋ฉ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ(data binding)์ ์ ๊ณต์์ ์๋น์๋ก๋ถํฐ ๋ฐ์ดํฐ ์๋ณธ์ ๊ฒฐํฉ์์ผ ์ด๊ฒ๋ค์ ๋๊ธฐํํ๋ ๊ธฐ๋ฒ์ด๋ค. ๋ผ๊ณ ์ํค๋ฐฑ๊ณผ๊ฐ ๋งํ๋๋ฐ, ์ฝ๊ฒ๋งํด SwiftUI์์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ view์ ๋ณด์ฌ์ค ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ์์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ์ธ๋ฉํ๋ ๋ฐ์ดํฐ์ ์ข ๋ฅ๋ ๋ค์ํ๊ณ ๊ทธ ์ฉ๋๊ฐ ๋ค ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ์ธ๋ฉ ํ๋ ๋ฐฉ๋ฒ๋ ๋ค์ํฉ๋๋ค. IOS ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ swift์์ ์ตํ ์ฌ์ฉํ๋๋๋ก ํ๋กํผํฐ๋ฅผ ์ ์ธํ๊ณ ์์ ํ๋ฉด ์๋ฌ๊ฐ ๋๋๊ฒ์ ๋ณผ ์ ์๋ค. ๊ทธ ์ด์ ์ ๋์ฒด ํค์๋์ธ @State์ ๋ํด์ ์์๋ณด์ ์ ์๋ฌ๊ฐ ๋๋๊ฐ? ์๋ ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ธ ContentView ํํ๋ก ๋ฒํผ์ ๋๋ฅด๋ฉด str์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์ฝ๋์ ๋๋ค. ํ์ง๋ง ์๋ ์ฝ๋๋ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. struct..