๐Ÿ“ฑ iOS

    [SwiftUI] NavigationLink์˜ isActive ๊ณต์œ  ์ด์Šˆ & ํ•ด๊ฒฐ

    [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 ์ฒ˜๋ฆฌํ•˜๊ธฐ

    [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

    ๋””๋ฐ”์ด์Šค ํ™”๋ฉด๊ณ ์ • 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์†์„ฑ

    [SwiftUI] Grid์†์„ฑ

    Grid์˜ ์†์„ฑ์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž. Grid์˜ ์ข…๋ฅ˜ : LazyHGrid, LazyVGrid ์†์„ฑ : fixed, flexible, adaptive LazyVGrid ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง์œผ๋กœ ๋‚˜์—ดํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ง์œผ๋กœ ๋‚˜์—ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— column์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. column์€ ์„ธ๋กœ ํ•œ ์ค„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. var body: some View { LazyVGrid(columns: columns) { ForEach(0..

    URLSession์„ ํ†ตํ•ดJSON ๊ฐ€์ ธ์˜ค๊ธฐ (2)

    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)

    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..

    Passing Data (์ง์ ‘์ „๋‹ฌ๋ฐฉ์‹)

    Passing Data (์ง์ ‘์ „๋‹ฌ๋ฐฉ์‹)

    ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์—ฌ์„ฏ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž ! 1. instance property ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ViewController ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›์„ property๋ฅผ ์„ ์–ธํ•˜๊ณ , ๊ทธ property์˜ ๊ฐ’์„ UI์— ์ ์šฉํ•˜๋Š” ์›๋ฆฌ์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ViewController propertyDataViewController.swift var passingData = "" //์—ฌ๊ธฐ์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌ๋ฐ›์„ ์˜ˆ์ • @IBOutlet weak var setPassingData: UILabel! //์—ฌ๊ธฐ์— ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ ์ ์šฉ override func viewDidLoad() { super.viewDidLoad() setPassingData.text = passingData } ๋ฐ์ดํ„ฐ๋ฅผ ..

    Auto Layout 1 [Why?]

    Auto Layout 1 [Why?]

    ๐Ÿ“ Auto Layout ์ด๋ž€ ? ์ œ์•ฝ์กฐ๊ฑด(Constraints)์— ๋”ฐ๋ผ ๋ชจ๋“  ๋ทฐ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๋™์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ ์ด๊ฒŒ ์™œ ํ•„์š”ํ•œ์ง€? ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Frame-Base Layout์— ๋Œ€ํ•œ ์‚ฌ์ „ ์ง€์‹์ด ํ•„์š”ํ•˜๋‹ค. Frame-Base Layout Xcode ์ƒ์—์„œ ์ด๋ฏธ์ง€ View์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ง€์ •ํ•˜๊ณ  Simulator๋กœ ์‹คํ–‰์‹œ์ผœ๋ณด์ž. (reviewํ™”๋ฉด์„ iPhone11๋กœ ํ•˜๊ณ , ํŒŒ๋ž€ ์ ์„  ํ‘œ์‹œ๊ฐ€ ๋œจ๋Š” ์ค‘๊ฐ„์œผ๋กœ ์œ„์น˜๋ฅผ ์ง€์ •ํ–ˆ์Œ) ์‹คํ–‰ํ•˜๋ฉด iPhone11์€ ์˜ˆ์˜๊ฒŒ ์ •์ค‘์•™์— ์ ๋‹นํ•œ ํฌ๊ธฐ๋กœ ์ด๋ฏธ์ง€๊ฐ€ ๋ฐฐ์น˜๋œ๋‹ค. ํ•˜์ง€๋งŒ SE๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ค‘์•™์— ๋ฐฐ์น˜ ๋˜์ง€ ์•Š๊ณ  ์œ„์น˜๊ฐ€ ์• ๋งคํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด๋ฒˆ์—๋Š” landscape(๊ฐ€๋กœ๋ชจ๋“œ) ๋กœ ๋Œ๋ ค ๋ณด์ž โ“ ์ด๋ฏธ์ง€๊ฐ€ ์‹ค์ข…๋๋‹ค. ์ด์œ ๋Š”, ์ฒ˜์Œ์— x์™€ y์˜ ๊ฐ’์„..

    [Stanford iOS] enum์˜ ์œ„๋Œ€ํ•จ

    [Stanford iOS] enum์˜ ์œ„๋Œ€ํ•จ

    powerful ํ•œ enum์„ ์ •๋ฆฌํ•ด๋ณด์ž. (๋ณธ ์ •๋ฆฌ ๋‚ด์šฉ์€ Stanford iOS๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.) enum์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•ด ์ฃผ์„ธ์š”. [Swift] ์—ด๊ฑฐํ˜•(Enumerations) ์—ด๊ฑฐํ˜•์ด๋ž€ ? ๊ณตํ†ต๋œ ์ฃผ์ œ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ชจ์•„ ๋‚˜ํƒ€๋‚ด๋Š” ์ž๋ฃŒํ˜•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ๋‚ด๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ๋‚ด์šฉ์ด ๊ณผ์ผ์— ๊ด€ํ•œ ๊ฒƒ์ด๊ณ  ์•ž์œผ๋กœ ๊ณผ์ผ ๋ณ€์ˆ˜๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐ 990427.tistory.com ์šฐ๋ฆฌ๋Š” ๊ณ„์‚ฐ๊ธฐ operation ๊ตฌํ˜„์„ ์œ„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ด๊ฑฐํ˜• ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ associated value๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ type์˜ ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , value๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ operation ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ณด๋ฉด, value๊ฐ€ associated ..

    [Stanford iOS] ๋ฒ„์ „๋ฌธ์ œ์— ์˜ํ•œ ๊ฐ์ข… error ํ•ด๊ฒฐ

    [Stanford iOS] ๋ฒ„์ „๋ฌธ์ œ์— ์˜ํ•œ ๊ฐ์ข… error ํ•ด๊ฒฐ

    ๊ณ ์ „๊ฐ•์˜๋ผ ๋ฒ„์ „์ด swift2 / iOS9 ์ด๋‹ค ๋ณด๋‹ˆ ๋งŽ์€ ์—๋Ÿฌ์— ๋ถ€๋”ชํžŒ๋‹ค 2022๋…„์— Stanford iOS๋ฅผ ๋”ฐ๋ผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ์ข… ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. ๐Ÿ“ [Section1] ๊ณ„์‚ฐ๊ธฐ sender.currentTitle์˜ nil error ์•„๋งˆ ์ด ๊ธ€์„ ์ฝ๋Š” ๋ถ„๋“ค์€ UIButton์„ ํด๋ฆญํ•ด์„œ sender.currentTitle์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ nil error์— ๋งˆ์ฃผํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ์ด์œ ๋Š” xcode13 ์ด์ „๊นŒ์ง€๋Š” UIButton์˜ style์˜ ๊ธฐ๋ณธ ๊ฐ’์ด Default ์˜€์ง€๋งŒ, xcode13๋ถ€ํ„ฐ๋Š” UIButton์˜ style์˜ ๊ธฐ๋ณธ ๊ฐ’์ด Plain ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, style์„ Default ๋กœ ๋ฐ”๊พธ์–ด ์ฃผ๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค. ๐Ÿ“ [Section2] ๋…ธ์น˜ ํƒ„์ƒ์œผ๋กœ ์ธํ•œ AutoLayout ์˜› iP..