일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 스위프트
- Git
- 디자인패턴
- UIKit
- interpace
- Protocol
- initializer
- instance
- 코딩테스트
- property
- url
- initalizer
- tuist
- IOS
- Method
- Unicode
- delegate
- String
- struct
- Class
- enum
- Foundation
- Swift
- 이니셜라이저
- optional
- Terminal
- Xcode
- extension
- init
- type
- Today
- Total
목록Swift/iOS (34)
아리의 iOS 탐구생활
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/2CWtK/btrswVLHKRW/w69BZFRN0DkO0SmICOzl21/img.png)
1️⃣ 스토리보드에서 감추기 네비게이션 컨트롤러를 클릭 후 우측 Inspector에서 Shows Navigation Bar 체크를 해제해준다. 2️⃣ 코드로 감추기 네비게이션 컨트롤러로 Embed In 되어있는 ViewController 내부에 다음과 같은 코드를 추가해준다. self.navigationController?.isNavigationBarHidden = true 위와 같은 방법은 Navigation Controller에 연결되어있는 모든 ViewController의 Navigation Bar가 숨겨진다. 특정 ViewController의 Navigation Bar를 숨기려면 다음과 같은 방법이 있다. 해당 방법은 View Life Cycle 메소드를 활용하여 뷰가 화면에 보일 때 Naviga..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Gz3ON/btrssCMQ4bd/tTpt2oDUy0RbwZwVE9k1A0/img.png)
iOS 기기는 한정된 메모리를 가지고 애플리케이션을 구동한다. 만약 사용자에게 보여주고 싶은 데이터가 많고 데이터의 양 만큼 많은 뷰가 필요하다면 어떻게 될까? 화면에 표시할 수 있는 뷰의 개수는 한정되어 있지만 표현해야하는 데이터가 많은 경우 반복된 뷰를 생성하기 보다는 뷰를 재사용할 수 있다. 사용할 수 있는 메모리가 작아서 데이터의 양만큼 많은 뷰를 생성하는 것은 메모리를 많이 낭비할 수 밖에 없기 때문이다. 뷰를 재사용하므로써 메모리를 절약하고 성능 또한 향상할 수 있다. ## 재사용의 대표적인 예 UITableViewCell UICollectionViewCell ## 재사용 원리 테이블뷰 및 컬렉션 뷰에서 셀을 표시하기 위해 데이터 소스에 뷰(셀) 인스턴스를 요청한다. dequeueReusabl..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b0hsVR/btrmKBeY6wj/OKQB3kajkrN60kIe2hGtS1/img.png)
프로젝트 피드백을 받다가 Frame과 Bounds는 어떤 차이가 있느냐는 질문에 궁금해서 찾아보게 되었다. # Frame Apple Developer Documentation developer.apple.com Super View 좌표계에서 View의 위치와 크기를 나타낸다. ## Frame의 origin(x, y) Super view의 원점을 (0,0)으로 놓고 원점으로부터 얼마나 떨어져 있는지를 나타낸다. 따라서 Frame의 origin 값을 변경하면 SubView도 그만큼 같이 움직인다. ## Frame의 Size(width, height) View 영역을 모두 감싸는 사각형으로 나타낸다. View 자체의 크기가 아니라 View가 차지하는 영역을 감싸서 만든 사각형이라고 이해하면 된다. ## 언제 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/uQBDh/btrmLNln9ab/T2WrUWeKDL1GkfvcdxKRw1/img.png)
Delegation을 한줄로 요약하자면 아래와 같다. 어떤 상황이 발생했을 때 어떤 객체에게 응답을 준다. 약간 리모콘을 발동시킨다는 느낌...? Delegate는 보통 Protocol을 정의하여 사용된다. Protocol이란 일종의 기능 명세서 같은 것으로 Delegate로 지정된 객체가 해야하는 메소드들의 원형을 적어놓는다. Delegate 역할을 하려는 객체는 이 Protocol을 따르며 원형만 있던 메소드들의 구현을 한다. 이렇게 세팅 후 이전 객체는 어떤 이벤트가 일어났을 시 Delegate로 지정한 객체에 알려줄 수 있다. # 장점 매우 엄격한 Syntax로 인해 프로토콜에 필요한 메서드들이 명확하게 명시된다. 컴파일 시 경고나 에러가 떠서 프로토콜의 구현되지 않은 메소드들을 알려준다 로직의 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cfyNex/btrmEjZkOdz/5GFK7kYOPI7MV76lYSOUb1/img.png)
UIView 요소를 코드로 직접 커스텀하여 사용하기 위해 만들던 와중에 override 이니셜라이저와 required 이니셜라이저, 총 2개의 이니셜라이저를 정의해야한다는 것을 알게되었다. override init(frame: CGRect) { super.init(frame: frame) } required init(coder: NSCoder) { super.init(coder: coder) } 근데 이 둘의 정체는 뭘까..?? 왜 재정의하며 파라미터로는 각각 다른 타입을 받고있는데, 어떤 것을 초기화하는 것일까? 한번 알아보자. # init(frame:) Apple Developer Documentation developer.apple.com 코드로 UIView Class의 View 인스턴스를 만들기 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/qJ3P7/btrlTWxviBH/z9UK7KU0kWnqYD2Vp6oeKk/img.png)
테스트 주도 개발(Test-Driven Development TDD)은 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나이다. 개발자는 먼저 요구사항을 검증하는 자동화 된 테스트 케이스를 작성한다. 그런 후에 그 테스트 케이스를 통과하기 위한 최소한의 코드를 생성한다. 마지막으로 작성한 코드를 표준에 맞도록 리팩토링한다. -위키백과 테스트 주도 개발을 말 그대로 개발을 하는데에 있어서 테스트가 주가 된다는 하나의 개발 방법론이다. 먼저 테스트를 하면서 코드를 작성하고 그 후에 본 코드를 구현하는 방식이다. 테스트를 거친 후에 코드를 작성한다면 추후에 신경 써줘야할 많은 부분들에 대해서 해결을 하면서 코드를 작성할 수 있겠다. 하지만 TDD를 언제나 고집하기에는 번거롭고 생산성이 떨어지는..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/vsifw/btrjbNIK5Yq/hWFftVZCK0cjaiuo8Rcs61/img.png)
Apple Developer Documentation developer.apple.com 새로운 ViewController 클래스를 만들게 되면 아래 prepare 메소드가 주석처리 되어있다. /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/AcKN3/btriX8U8MUS/cLK98LjlAkDCCYC90kyK1K/img.png)
Apple Developer Documentation developer.apple.com 값을 늘리거나 줄이는 컨트롤. # 화면에 Label과 Stepper 추가하기 라이브러리 창을 켜서 Label과 Stepper를 추가해준다. Label의 텍스트와 폰트 크기를 취향껏 조절해준다. 아래 예제처럼 Auto Layout을 설정해준다. Auto Layout을 설정하지 않는다면 화면크기가 달라질때마다 위치가 바뀔 수 있다. # @IBOutlet과 @IBAction을 설정하고 코드와 연결 Label과 Stepper를 코드에 연결하여 @IBOutlet 추가 마찬가지로 @IBAction 메서드도 추가해주자. Stepper를 동작할 때마다 Label의 텍스트가 변하도록 설정해준다. # 완성 # 주요 프로퍼티 살펴보기 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/q4kHz/btriz0o1ytn/EkB4OIEbGVGKhD3WkWnKl1/img.png)
# ViewController의 생명주기란? 각각의 ViewController들은 생명주기란 어떤 것이냐면 말그대로 ‘보여졌다. 사라지는’ 주기를 이야기한다. 생명주기 관련 메서드들을 잘 활용하면 화면을 재구성하거나 할 때 유용하게 쓰이므로 잘 알아두는 것이 좋다. 정상적인 ViewController 생명주기를 요약하자면 Appearing 상태를 거쳐서 Appeared 상태가 진행되고, 만약 종료하려면 Disappearing 상태를 거쳐서 Disappeared 상태로 진행된다. 정상적이지 않은 등장하는 도중에 다시 퇴장되는 경우가 있는데 이럴 때는 Appearing 상태에서 Appeared상태로 가지않고 곧바로 Disappeared 상태로 가게된다. 사용자가 홈버튼을 눌러 앱을 백그라운드 상태로 보냈을 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/TBeLv/btriBd1vSr5/Mej1bVUR0y6ZFA8okdiWUk/img.png)
Apple Developer Documentation developer.apple.com 계층적 내용을 탐색하기 위한 스택 기반 체계를 정의하는 컨테이너 뷰 컨트롤러. 여기서 스택기반이라고 하는 것은 한마디로 Stack을 쌓아가는 구조다. 간단한 예를 들어보면 크롬을 사용할 때 뒤로가기나 앞으로 가기를 눌러 전 화면에 접근을 할 수 있는데 이것 또한 스택구조로 이루어져 있다. Stack : LIFO(Last In First Out)로 역순 탐색을 위한 구조 Stack에서 Push : 데이터 쌓기 Stack에서 Pop : 데이터 빼기 (뒤로가기) # NavigationController 먼저 rootViewController로 설정해줄 컨트롤러를 누르고 Editor > Embed in > Navigatio..