전체 글

Swift, Java, iOS&macOS, Spring Boot, CI/CD
·iOS(macOS)/SwiftUI
[SwiftUI] 하나의 View에서 Alert을 여러 개 사용할 때 주의할 점.  SwiftUI에서 Alert 을 사용하는 기본적인 방법은 다음과 같다.@State public var isShow1: Bool = falsevar body: some View { VStack(spacing: 30.0) { Button { self.isShow1.toggle() } label: { Text("Alert 1") } .alert(isPresented: $isShow1) { return Alert(title: Text("Alert1 show.")) } } .padding()} ..
·일기
최근 ChatGPT가 굉장한 화제이다. 나도 회사에서 일할 때나 영어공부 할 때 엄청 잘 쓰고 있다. 지난주에 팀장님이 무슨무슨 기능을 만드는게 가능한지 아닌지 서치좀 해보라고 시켰는데, 한 일주일 정도 찾아보다가 도저히 뭔 방법이 안나와서 ChatGPT한테 물어봤더니, 불행하지만 그런 기능은 만들 수 없다고 하더라. 그래서 팀장님한테 “찾아봤는데, 그런 기능은 만들 수 없다고 합니다.” 라고 보고를 했고, 고생했다는 짧은 피드백을 받고 일단락 되었다. 그런데 문득 그런 생각이 들었다. 만약 내가 GPT한테 물어봤다는 내용을 같이 보고했으면, 팀장님은 그걸 온전히 나의 성과로 생각했을까? GPT한테 질문해서 받은 답변으로 일을 하면 그 일은 내가 한걸까 GPT가 한걸까? 유튜브 영상을 “그대로” 베껴서 ..
·iOS(macOS)/SwiftUI
[SwiftUI/Xcode] 미리 보기(Preview) 화면 숨기기/나타내기  📎 단축키숨기기 : [⌘ + ↩] (command + return)나타내기 : [⌘ + ⌥ + ↩] (command + option + return) ❗️ 단축키가 생각이 나지 않는다면- Xcode 우측 상단의 메뉴 버튼 클릭 후,숨기기 : [Show Editor Only]나타내기 : [Canvas]이거 모를 때는, 미리 보기 화면 안 보이게 하고 싶을 때마다 PreviewProvider struct 전체를주석처리 해가면서 썼었는데.. 알고 난 다음부터는 편하게 사용 중이다. SwiftUI를 처음 접했을 때, 한참 이것저것 만져보다가 실수로 커맨드+엔터를 입력했더니갑자기 화면이 사라져서 당황했던 적이 있었음... 그때 이런 ..
·iOS(macOS)/Swift
간단한 채팅 형식의 View를 가지는 앱을 만들어보는 도중, 아래 표시한 Back Button의 Title 을 지워야 하는 일이 생겼다.처음엔 굉장히 간단하게 해결할 줄 알았는데, 헛다리를 짚는 바람에 꽤 시간을 오래 잡아먹었다 ㅜㅜ.  구글링을 통해 알아낸 방법은, navigationItem.backBarButtomItem 값을 새로운 UIBarButton 객체로 덮어 씌우라는 것이었다.// 뒤로가기 버튼에 적혀있는 title 지우기.self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) 위 코드를 전환된 화면(현재 화면)에 해당하는 ViewController 의 v..
·iOS(macOS)/Swift
노치 디자인의 Safe Area를 색칠하는 여러 가지 방법 위의 이미지처럼 상단과 하단 Safe Area의 색을 다르게 설정해야 하는 상황이 생겼다. 우선 내가 먼저 알고 있었던 Safe Area에 색깔을 설정하는 방법은, 최상단 View의 Background Color를 설정해주는 방법 밖에는 없었다. 그런데 이 방식으로는 상/하단의 영역을 분리해서 칠하는 건 할 수 없는 것으로 확인했다. 그래서 Safe Area coloring, only bottom 등의 키워드로 구글링을 해보았다. 그 결과 예제나 라이브러리를 알게 되긴 했지만, 내가 정확히 원하는 예제를 얻어내는 데에는 실패했다. 사실 아주 단순한 방법이 있었는데, 그 방법을 바로 떠올리지를 못해서 며칠 동안 삽질을 했다. (돌고 돌아 원하는 기..
·Delphi
업무상 메인으로 유지보수중인 시스템이 있는데, 특정 폼을 수정하고나면 프로그램 exe가 실행 자체가 안되는 경우가 종종 있었다. 특이한건 개발PC 에서는 아무 탈 없이 실행이 되는데, 클라이언트 PC에서만 실행이 안된다는것.. 원인을 찾으려고 약 이틀간 삽질한 결과.. 그 '특정' 폼에 사용된 ADOConnection 의 속성값이 문제였다. 프로그램에 ADOConnection과 ADOQuery가 떡칠(...)이 되어있는데, 사용된 ADOConnection 들 중 하나에만 Connected 속성값이 True로 되어 있었다. 위 이미지의 Connected 속성이 True 로 되어있었다. 이게 어디에 써먹는건지도 여태 몰랐는데, 이번 기회에 특징을 조금 알게 되었다. 우선 저게 체크되어있으면, 델파이로 소스를..
·iOS(macOS)/Swift
🧐 iPhone Safe Area 크기 가져오기  Safe area의 배경색을 지정하고 싶다면, 메인 View의 BackgroundColor를 지정해주면 된다.하지만 아래 화면처럼 상/하단이 동시에 적용이 되어버린다. 나는 아래쪽만 적용하고 싶어서, UIView를 코드로 각각 생성해서 addSubview()로 추가해주는 방식으로 해결을 했다.(더 좋은 방법이 있는지는 찾아보는 중...) 그런데 노치가 없는 디자인의 아이폰은 하단 Safe Area가 없으므로,현재 화면상의 Safe Area의 크기를 받아와서 처리해줘야 할 필요가 있다. 그래서 아이폰의 상/하단 Safe Area의 크기를 가져와 활용할 수 있는 코드를 찾아보았다.if #available(iOS 13.0, *) { let window ..
·iOS(macOS)/Swift
🧐 Xcode - Rename 기능 사용법 Storyboard 또는 Xib에서 Outlet으로 변수를 가져오고 난 뒤에 변수명을 변경하고 싶다면 Rename 기능을 사용하는 것이 좋다. 📎 사용법 나의 경우, 위처럼 [Lab'el']을 [Lab'le']로 잘못 쓰는 경우가 종종 있다. 이때, swift 파일의 코드만 고친다면 해당 UI가 열릴 때 "this class is not key value coding-compliant for the key" 에러가 발생한다. 대략 변수명을 바꾼 것이 다른 메뉴에는 적용이 되지 않았다는 의미로, 기존 변수명을 찾을 수 없어서 발생하는 것이다. 이는 Connections Inspector에서 먼저 확인해볼 수 있다. swift 파일에서 변수명을 아무리 바꿔주어도, ..
·iOS(macOS)/Swift
🧐 (Xcode 13) 시뮬레이터상 키보드(아이폰/패드 키보드)가 안 보일 때 Storyboard에서 화면 위에 Text field를 올려놓고, 시뮬레이터로 테스트를 해보는데 아이폰 키보드가 시뮬레이터 위로 올라오지 않았다. 이는 맥북과 연결되어 있는 Hardware 키보드를 인식하도록 설정이 되어 있어서 그런 것이므로, 아래의 방법으로 해결할 수 있다. [해결방법 1] 시뮬레이터에서 단축키 [⌘+K] 를 입력하면 바로 작동한다. [해결방법 2] 1. 시뮬레이터의 상단 메뉴 -> I/O 메뉴 클릭 2. Keyboard -> "Connect Hardware Keyboard" 항목 체크 해제. 해결방법 출처: https://stackoverflow.com/questions/24420873/xcode-6-ke..
·iOS(macOS)/Swift
간략한 스위프트 문법/사용법 정리 🧐 고차함수 (Higher-order function) 매개변수로 다른 함수를 받거나, 실행된 결과를 다시 함수로 반환하는 함수를 고차함수라고 한다. 스위프트 표준 라이브러리에서는 여러 유용한 고차함수를 제공한다. 📎 map 원소 전체를 순회하는 로직을 간결하게 처리할 수 있음. let names = ["kim", "lee", "min", "john"] // 기본형 let names1 = names.map { (name) in return name + "님" } // 축약형 let names2 = names.map { $0 + "님" } // 문자열의 길이 let names3 = names.map { $0.count } print(names1) print(names2) ..