Clover
article thumbnail
[iOS/Swift] NavigationController 뒤로가기 버튼 타이틀 수정하기
iOS(macOS)/Swift 2022. 10. 27. 21:55

NavigationController 뒤로 가기 버튼의 Title 수정하기 간단한 채팅 형식의 View를 가지는 앱을 만들어보는 도중, 아래 표시한 Back Button의 Title 을 지워야 하는 일이 생겼다. 처음엔 굉장히 간단하게 해결할 줄 알았는데, 헛다리를 짚는 바람에 꽤 시간을 오래 잡아먹었다 ㅜㅜ. 구글링을 통해 알아낸 방법은, navigationItem.backBarButtomItem 값을 새로운 UIBarButton 객체로 덮어 씌우라는 것이었다. // 뒤로가기 버튼에 적혀있는 title 지우기. self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) ..

article thumbnail
[iOS/Swift] Safe Area를 색칠하는 방법
iOS(macOS)/Swift 2022. 9. 30. 17:40

노치 디자인의 Safe Area를 색칠하는 여러 가지 방법 위의 이미지처럼 상단과 하단 Safe Area의 색을 다르게 설정해야 하는 상황이 생겼다. 우선 내가 먼저 알고 있었던 Safe Area에 색깔을 설정하는 방법은, 최상단 View의 Background Color를 설정해주는 방법 밖에는 없었다. 그런데 이 방식으로는 상/하단의 영역을 분리해서 칠하는 건 할 수 없는 것으로 확인했다. 그래서 Safe Area coloring, only bottom 등의 키워드로 구글링을 해보았다. 그 결과 예제나 라이브러리를 알게 되긴 했지만, 내가 정확히 원하는 예제를 얻어내는 데에는 실패했다. 사실 아주 단순한 방법이 있었는데, 그 방법을 바로 떠올리지를 못해서 며칠 동안 삽질을 했다. (돌고 돌아 원하는 기..

article thumbnail
[iOS/Swift] Safe Area 크기 가져오기 (iOS15~)
iOS(macOS)/Swift 2022. 9. 14. 23:13

🧐 iPhone Safe Area 크기 가져오기 Safe area의 배경색을 지정하고 싶다면, 메인 View의 BackgroundColor를 지정해주면 된다. 하지만 아래 화면처럼 상/하단이 동시에 적용이 되어버린다. 나는 아래쪽만 적용하고 싶어서, UIView를 코드로 각각 생성해서 addSubview()로 추가해주는 방식으로 해결을 했다. (더 좋은 방법이 있는지는 찾아보는 중...) 그런데 노치가 없는 디자인의 아이폰은 하단 Safe Area가 없으므로, 현재 화면상의 Safe Area의 크기를 받아와서 처리해줘야 할 필요가 있다. 그래서 아이폰의 상/하단 Safe Area의 크기를 가져와 활용할 수 있는 코드를 찾아보았다. if #available(iOS 13.0, *) { let window =..

article thumbnail
[iOS/Xcode 13] Rename - Outlet 변수 이름 수정 방법
iOS(macOS)/Swift 2022. 8. 15. 01:00

🧐 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 파일에서 변수명을 아무리 바꿔주어도, ..

article thumbnail
[iOS/Xcode 13] 시뮬레이터 키보드 보이게 하는 법
iOS(macOS)/Swift 2022. 8. 15. 00:08

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

[Swift/문법] 고차함수 (Higher-order function)
iOS(macOS)/Swift 2022. 8. 11. 14:37

간략한 스위프트 문법/사용법 정리 🧐 고차함수 (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) ..

[Swift/문법] 프로토콜 (Protocol)
iOS(macOS)/Swift 2022. 8. 10. 16:59

간략한 스위프트 문법/사용법 정리 🧐 프로토콜(Protocol) 프로토콜(Protocol)은 특정 기능 수행에 필수적인 요소를 정의해놓은 규격을 말한다. 반드시 구현해야 하는 요구사항을 정의해놓는 청사진이라고 할 수 있다. (Java의 추상 클래스나 interface와 비슷한 역할을 한다고 이해할 수 있을 것 같다.) 📎 생성 방법 protocol Talkable { // property var topic: String { get set } var language: String { get } // 상수(let)는 사용할 수 없다. // let sound: Int { get set } // Error // Method func talk() // Initializer init(topic: String, la..

[Swift/문법] 익스텐션(Extension)
iOS(macOS)/Swift 2022. 8. 10. 14:11

간략한 스위프트 문법/사용법 정리 🧐 익스텐션(Extension) 클래스, 구조체, 열거형, 프로토콜 타입에 기능을 추가(확장)할 수 있다. 클래스를 상속받지 않아도 되고, 원본 코드를 몰라도 기능을 확장시켜서 사용할 수 있도록 하는 문법이다. (새 기능을 추가할 수는 있지만, Override는 할 수 없음.) 📎 사용법 // 숫자(int) 짝수, 홀수 extension Int { var oddOrEven: String { if self % 2 == 0 { return "짝수" } else { return "홀수" } } } print(3.oddOrEven) // 출력: "홀수" print(4.oddOrEven) // 출력: "짝수" 기본 자료형(Int, Float, String 등)은 구조체(struc..

[Swift/문법] 클래스(Class), 구조체(Structure)
iOS(macOS)/Swift 2022. 8. 10. 00:39

간략한 스위프트 문법/사용법 정리 🧐 클래스(Class) 클래스는 참조 타입(Reference Types)이다. 따라서 원본의 값이 변경될 수 있음을 유의해야 한다. 그리고 클래스 내부에 선언된 프로퍼티(멤버 변수)는 반드시 초기화가 되어야만 한다. 따라서 클래스는 반드시 하나 이상의 생성자를 가져야 하고, 생성자를 통해 프로퍼티를 초기화 해주어야 한다. 만약 변수 선언과 동시에 초기화를 한다면 생성자에서 초기화를 하지 않아도 에러가 발생하지는 않고, 초기화를 하기 어려운 변수라면 옵셔널로 선언해야 한다. 📎 init(생성자) - Designated Initializer(지정 생성자) class UserInfo { var name: String var id: String // 지정 생성자 init(nam..

[Swift/문법] Enumerations (enum, 열거형)
iOS(macOS)/Swift 2022. 8. 9. 01:57

간략한 스위프트 문법/사용법 정리 🧐 enum(열거형) 기본 사용법 📎 기본 생성 enum Weekday { case mon case tue case wed, thu, fri, sat, sun } // 할당 let day: Weekday = Weekday.mon - 열거형 타입의 이름은 대문자로 시작하는 것을 권장한다. 📎 switch - case switch day { case .mon, .tue, .wed, .thu, .fri: // 타입 생략 가능 print("평일") case Weekday.sat: print("토요일") case .sun: print("일요일") } 📎 if - else if day == Weekday.fri { print("불금!") } else { print("불금이 아님 ㅜ..

[Swift/문법] Closure (클로저)
iOS(macOS)/Swift 2022. 8. 7. 14:50

간략한 스위프트 문법/사용법 정리 클로저(Closure)는 다른 언어의 람다(lambdas)와 비슷한 개념이다. 🧐 Closure 생성 방법 예시) 아래의 함수는 Int 타입의 매개변수를 받아서 "score: ~~"으로 반환해주는 함수이다. func getScore(a: Int) -> String { return "score: \(a)" } print(getScore(50)) // 출력: "score: 50" 위의 함수를 클로저로 구현하면 아래와 같다. let getScore = { (a: Int) -> String in return "score: \(a)" } print(getScore(100)) // 출력: "score: 100" 📎 축약형 - 클로저의 내부 코드가 한 줄 일때 return을 생략할 ..