본문 바로가기

iOS/iOS

(15)
iOS) Dark Mode 지원하기 Color Asset 생성 1. Color Asset들을 담을 폴더 생성 Assets.xcassets -> 오른쪽 버튼 클릭 -> Folder 굳이 폴더를 안만들어도 되지만 깔끔하게 정리하기 위해 만들자. 2. 생성한 폴더에 Color Set 생성 생성한 폴더 명을 원하는 이름으로 바꾸고 해당 폴더에서 오른쪽 버튼을 눌러 Color Set을 추가한다. 3. Any와 Dark에 대해 컬러 지정 Color Set을 생성하면 기본적으로 Appearances가 Any, Dark로 지정된다. 여기서 Any는 다크모드가 지원되지 않는 오래된 버전에서의 색상값을 지정할 때 사용한다. 현재 프로젝트에서는 라이트모드가 Any와 동일하므로 Any, Light, Dark 대신 Any, Dark으로 하였다. 각 모드에 대해 ..
iOS) SwiftLint 적용하기 - CocoaPods SwiftLint A tool to enforce Swift style and conventions, loosely based on GitHub's Swift Style Guide. Realm에서 제공하는 Swift 전용 Lint이다. 여기서 Lint란 소스 코드를 분석하여 프로그램 오류, 버그, 스타일 오류, 의심스러운 구조체에 표시(flag)를 달아놓기 위한 도구들을 가리킨다. 1. CocoaPod 설치 sudo gem install cocoapods 혹시 CocoaPod이 설치되어 있지 않다면 다음의 명령어를 실행하면 된다. 2. CocoaPod 적용 pod init 터미널에서 프로젝트 디렉토리로 이동한 후 pod init을 한다. 그러면 다음과 같이 Podfile이 생성된다. 3. Podfile ..
iOS) gitignore 적용하기 gitignore Specifies intentionally untracked files to ignore 프로젝트를 깃에 올릴 때 특정 파일이 추적되지 않도록 하기 위해서 사용한다. 보통 불필요한 충돌을 발생시키는 것을 막거나 공유되지 말아야 할 프로젝트 정보를 감추기 위해 사용된다. 만일 프로젝트 진행 중에 gitignore를 추가하면 이미 추적된 파일에 대해서는 적용되지 않는다. 추가 방법 gitignore.io를 이용하면 쉽게 gitignore 파일을 생성할 수 있다. gitignore.io에서 원하는 키워드를 다음과 같이 작성한다. 그러면 위와 같은 text가 생성된다. 전체 선택하여 복사한 후 프로젝트를 진행할 디렉토리에 .gitignore 파일을 생성하면 된다. 당연히 디렉토리는 깃과 연결된..
iOS) 서버와 데이터 통신을 위해 URLRequest 작성하기 Json으로 Post하기 URLRequest 생성시 기본 헤더는 Json이 아닙니다! Network API 통신을 하여 데이터를 외부 서버로 전송할 때 보통 json 형식으로 인코딩하여 보냅니다. MongoDB로 Json 데이터를 전송하는데 데이터가 계속 이상하게 보내졌습니다. { "name" : "playlistViewed", "createdAt" : "2020-12-16T15:43:07.294+0900", "metadata" : { "from" : "today" } }보내고자 했던 형식은 위와 같은데 자꾸 보내지는 데이터는 아래와 같았습니다. { "\"name\":\"playlistViewed\",\"createdAt\":\"2020-12-16T15:43:07.294+0900\",\"metadata\..
iOS) CoreData - Migration 코어데이터 변경 및 마이그레이션 코어데이터 모델을 변경하고 마이그레이션을 하지 않았더니 다음과 같은 에러가 발생했습니다. 코어데이터를 처음 사용하는 것이라 마이그레이션을 해야한다는 것 조차 모르고 그냥 변경했더니 에러가 주르륵... 일단 급한대로 시뮬레이터에 설치된 앱을 지웠더니 에러는 사라졌습니다. 매번 코어데이터를 변경할 때마다 앱을 지우고 다시 깔 수도 없고 특히 이미 배포해 버린 후라면 유저들에게 일일이 앱을 지우고 다시 설치해달라고 할 수 없으니 코어데이터 모델을 변경하는 법을 알아봅시다. 새로운 모델 버전 추가 Add Model Version Editor -> Add Model Version 을 선택하고 이름을 버전 2라는 의미로 기존 모델 명에 v2를 추가하여 생성합니다. 그러면 다음과 같이..
iOS) Build input file cannot be found 에러 해결 Git으로 협업할 때 project.pbxproj 충돌 해결 xcode로 작업하다가 다음과 같은 에러가 발생했을 때 여러 원인이 있을 수 있다. Info.plist 파일의 위치가 잘못됐을 때 프로젝트 명을 바꾼 후 경로가 이상해졌을 때 Xcode 10으로 업그레이드 한 후 그치만 나의 경우 Git으로 협업할 때 머지하는 과정에서 project.pbxproj 파일에 충돌이 발생해서였다. 정확히 말하자면 충돌이 발생하지 않았다.😡 아무 충돌없이 머지되어 잘 된줄 알았는데 날벼락같이 저런 에러가 발생했다. 혹시나 하는 마음에 project.pbxproj을 열어보니 문제가 됐던 파일인 Badgeable.swift가 중복되어 생성되어있었다. 나와 다른 팀원이 둘 다 같은 이름의 파일을 생성하고 머지해서 생긴 문제..
iOS) NavigationBar의 Border 지우기 xcode에서 NavigationBar를 만들었을 때 다음과 같이 선이 생긴다. 스토리보드 상에서 지울수 있는 방법이 없을까 찾아봤지만 없는듯하다. 대신 코드에서 지우는 방법을 찾았다. override func viewDidLoad() { super.viewDidLoad() setNavigationBar() } func setNavigationBar() { self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for:.default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.layout..
iOS) UITableView로 채팅 UI 만들기(1) 생성 UITableView 생성 UITableView를 스토리보드에 추가한다. 그다음 assistant를 열고 컨트롤러에 IBOutlet으로 연결한다. Prototype Cell 생성 우측 상단의 뷰 인스펙터 중 Attributes를 선택 후 Prototype Cells의 수를 필요한 만큼 증가시킨다. 그다음 File-> New-> File...을 선택하여 스토리보드에 생성된 프로토타입 셀에 대한 뷰 파일을 생성한다. Cocoa Touch Class를 선택 후 subclass는 UITableViewCell을 선택한다. 기본적으로 생성한 셀은 커스텀이다. 생성한 후 반드시 테이블 뷰 셀의 identifier를 지정해줘야한다. message에 해당하는 label과 messageBox에 해당하는 UIView를..
iOS) NSCoding과 Archive를 통한 데이터 저장 - (2) enum type archive 처음에 enum 타입을 통으로 encode했더니 에러가 발생하였다. archive할 때 화나는 점이 encode 하거나 decode할 때 따로 확인하지 않으면 에러가 발생하지 않는다는 것이다. unit test를 생활화하자! 아무 에러없이 돌아가서 문제가 있는지 모르다가 멀티 씬을 적용했을 때 데이터가 초기화 되길래 하나씩 살펴보니 enum에서 문제가 있었다. Convert rawValue to enum enum의 rawvalue인 String 타입으로 encode한 다음 decode할 때 해당 스트링에 매칭되는 enum 값을 찾도록 하였다. enum ProcessedType: String { case processed = "processed", lowFatProcesse..
iOS) NSCoding과 Archive를 통한 데이터 저장 - (1) decode 타입 지정 오류 해결 NSCoding과 NSKeyed(Un)Archiver 디바이스를 껐다 켜도 데이터가 영구적으로 남아있도록 하기 위해 직접 만든 클래스가 NSCoding이라는 프로토콜의 정의를 따르도록 했다. 자세하게 알아보지 않고 그냥 사용법만 대충 보고 구현해봤다. NSCoding프로토콜의 정의를 따르기 위해서는 requred init과 encode 메소드를 구현해야 한다. 개인적으로 이해한 바로는 encode가 데이터를 인코딩 하는 것이고 requred init에서는 인코딩된 데이터를 디코딩하여 쓰는 것이라 생각하고 있다. 위의 메소드를 직접 불러서 사용하기 보다는 NSKeyedArchiver와 NSKeyedUnarchiver를 통해 자동으로 불려지는 것 같다. decode 타입 지..