Xcode에서 storyBoard없이 개발하기 - 뷰 하나 띄우기

이미지
storyBoard없이 개발하기 UIViewController를 storyBoard없이 만들기 IOS를 개발하다보니, storyBoard를 가지고 개발하는 경우와 없이 개발하는 방법 두 가지가 혼재되어있어, 이번 기회에 storyBoard없이 개발하는 방법에 대해 공부해보려 한다. 스토리 보드 없이 코드만으로 화면을 구성하려면, 스토리 보드만 지우면 되는게 아닌 메인 인터페이스 설정 및 코드상에서 window에 대한 설정을, 진입점을 잡아줘야 한다. 환경 설정 스토리 보드 지우기 -> 실행 (Thread 1: Exception: "Could not find a storyboard named ‘Main’ in bundle NSBundle) Project -> General -> Main interface -> 공백입력 info.plist -> Application Scene Manifest -> Storyboard Name -> 줄 전체 삭제 -> 실행 (Thread 1: Exception: "Invalid parameter not satisfying:) iOS 13 이상만) iOS 13 이전에는 모든 장면 기능이 AppDelegate.swift 클래스에 있었으며 이제는 SceneDelegate.swift라는 별도의 클래스에 있습니다. SceneDelegate.swift 에서 프로젝트를 설정하겠습니다. 아래와 같은 코드를 SceneDelegate.swift 에서 작성(수정)합니다. func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return }

[Swift-30-Projects] 02. IOS 클론코딩 Stopwatch

이미지
[Swift-30-Projects] 02. IOS 클론코딩 Stopwatch Stopwatch 앱 뜯어보기 화면 절반은 뷰, 절반은 테이블 뷰 뷰의 절반은 디스플레이, 나머지는 제어 버튼 테이블 뷰는 기록 셀이 들어가야 함 기능 한 페이지 짜리 앱이다. 초기 상태 : [LAB, START], START 버튼을 누르면 [LAB, STOP] LAB은 기록. STOP 누르면 [RESET, START] 시작 버튼을 누르면 스톱워치가 가야한다. 랩을 누르면, 기록이 저장되어야한다. 화면 구성 storyBoard로 구성할 수 있는 만큼 함. 싱글 뷰를 하나 만들고 하위에 스탑워치를 위한 뷰, 시작 종료를 위한 버튼2개, 기록을 나타낼 테이블 뷰를 넣는다. 뷰에는 라벨을 2개 넣어 기본 경과 시간과, 랩간 차이를 보여주는 라벨을 넣는다. 조작 버튼은 누를 때 마다 스탑워치의 상태를 변경한다. 테이블 뷰를 하나 만들고, 테이블 뷰 안에는 랩 버튼을 누를 때마다 셀을 넣어준다. 버튼동작 [스타트, 랩, 리셋, 스탑 버튼] 다른 기능은 생각하지 않고 버튼의 동작과, 스탑워치의 진행 상태값만 고려하여 구현한다. 초기는 [LAB, START] 상태로 둔다. START -> [LAB, STOP] -> [RESET, START] RESET 버튼을 누르면 초기화 상태. LAB 버튼을 누르면, 테이블에 시간 기록. 시간 시작, 멈춤, 초기화 isPlaying 이 true인 상태 즉 기록이 되는 중 에만 시간이 가고 false인 상태에서는 멈춰야한다. 데이터를 위해 타이머 모델을 하나 만들어준다. 필요한 내용은 타이머객체와 시간카운터이다. 타이머는 문서 를 보고 만든다. 0.035 초마다 시계를 업데이트 해줄 것이고 계속 반복하기 때문 mainStopwatch.timer = Timer.scheduledTimer(timeInterval: 0.035, target: self, sel

[Swift-30-Projects] 01. IOS 클론코딩 GoodAsOldPhones

이미지
[Swift-30-Projects] IOS 클론코딩 GoodAsOldPhones Good As Old Phones 앱을 구조 살피기 앱 레이아웃 구성 Products Details Contact Us 앱을 구조 살피기 화면은 크게 2개의 Tab Bar로 구성되어있다. Products 와 Contact Us. 상품의 목록을 나열하는 Products는 테이블 뷰로 이루어져있다. 각각의 상품을 입력하면, 상세페이지로 넘어간다. 상세페이지에는 카트에 추가할 수 있는 버튼이 있다. Contact Us 페이지는 하나의 UIView이며, 연락처가 적혀있다. 앱 레이아웃 구성 앱 동선은 Storyboard를 이용해서 구성해준다. 먼저 크게 Tab Bar 컨트롤러로 두 화면을 갈라준다. 그리고 각각의 Tab Bar의 Item의 이름을 Products와 Contact Us로 변경해준다. 간단한 Contact Us 페이지에는 UIView를 넣어준다. Products 페이지에는 Navigation Controller와 TableView를 추가해준다. TableView의 Cell 선택시에는 UIView로 이동할 수 있도록 해준다. Contact Us 간단한 페이지 부터 구현한다.(개인취향이기 때문이다.) Custom Class로 ContactUsViewController를 추가해주고 하나 생성해준다. override func viewDidLoad() { super.viewDidLoad() setupScrollView() setupContents() } ContactUsViewController를 만들어준다. Storyboard에서 해당 UIView를 컨트롤 할 컨트롤러로 UIViewController를 지정해준다. 뷰가 로드되는 시점에 스크롤 뷰를 하나 생성하고, 뷰를 하나 생성한다. 뷰에 스크롤뷰를 추가하고, 스크롤 뷰에 뷰를 서브뷰로 추가한다. func set

데이터야 난 떠난다!

이미지
데이터야 난 떠난다! 선생님 서비스 개발이 하고 싶어요! 와디즈에 데이터 분석가로 입사를 하고 2년이 지난 시점 새로운 제안이 들어왔다. IOS개발을 해보면 어떻냐는 제안이었다. IOS 개발 인력이 부족하다는 사실 이외에 앞, 뒤로 아무 개연성 없이받은 제안이었다. 당시 담당하고 있었던 업무는 크게 두 가지였다. 하나는 새로운 데이터 파이프라인을 만드는 업무였고, 또 하나는 GA(GoogleAnalytics)와 관련된 전반적인 관리와 개선작업 이었다. 물론 담당하고 있는 업무에 불만은 없었다. 하지만 계속 누군가를 위해 일하는 느낌으로 하던 업무를 하고 있었던 것도 사실이다. 데이터 기반의 의사결정을 위한 데이터를 만드는 것은 나지만 의사결정권은 1도없는 일들을 예로들 수 있다. 요청을 받으면 요청을 처리해주고, 또 더 문제가 생기면 해결해주는 일이었다. 이런 상황에서 서비스 개발직무로의 변경 제안은 솔깃했고, 직접 서비스를 개발하고 싶다는 생각을 심어주었다. IOS개발자로 전향 한 후 어려웠던 점 태어나서 처음 하는 모바일, IOS개발을 시작해야 했기 때문에 알아야 할 것들이 너무 많았다. 애플에서 지원하는 인증서의 개념부터 시작해서 언어, 라이프 싸이클까지 모르는 것 투성이였다. 또한 개발자로서의 기본기가 전혀 갖춰져 있지 않았다. 지식만 있었고 경험이 없었다. 피쳐 브랜치는 어떤 이름으로 따서 어디에 PR을 날려야 하는지 몰랐고, 처음보는 종류의 에러메시지는 이유를 알 수가 없었다. 공부만 하는 것은 현실적으로 불가능 한 부분이라, 아무것도 모르는 상태로 실제 코드를 수정하면서 작업을 해야하는 두려움도 있었다. 프로젝트 중간에 들어가서 진행 과정을 보고 개발을 했던 것은 엄청난 스트레스를 가져다 주었다. 재미있던 점 서비스의 한 부분을 만드는 느낌을 많이 받았다. 버튼을 추가하더라도 와디즈의 색상코드로, 안내문구와 이모지도 와디즈스럽게 만들어야 했다. 누군가 꼭 이렇게 해야한다라고 해서 만든

[book] 용의자 x의 헌신

이미지
[book] 용의자 x의 헌신 탐정 갈릴레오 시리즈의 세 번째 작품. 사실상 첫 히가시노 게이고 작품을 입문하게된 책. 초기에 살인사건의 과정과 범인이 드러나고 시작하는 특이한 구성. 갈릴레오 탐정이라 불리는 주인공의 라이벌이 등장한다. 물리학자 대 수학자의 두뇌싸움이라는 구성이 마음에 들었다. 풀 수 없는 문제를 만드는 것과 그 문제를 푸는것 중 어떤게 더 어려울까라는 문제를 던져주었다. 그리고 이어서 그 문제는 사랑과 관련있음을 알려준다. 논리적인 것에 사랑이라는 더해지면 더 이상 설명하기가 힘들어진다. 왜 이런 행동을 했을까? 하지만 그 이유는 간단하다 사랑하기 때문이다. 극한의 논리로 이루어져 있는 사람이 논리적으로 사랑을 풀어가는 모습이 정말 기이하다. 어떻게 보면 논리 적이지만 그 논리 자체가 모순이다. 그 모순속에서 진정한 사랑을 볼 수 있다. 차가운 이성과 따듯한 감성이 적절하게 어우러져있는 드라마가 참 좋다.

[book] 탐정 갈릴레오

이미지
[book] 탐정 갈릴레오 탐정 갈릴레오 시리즈의 첫 번째 작품. 등장 인물에 대한 설명도 묘사도 적었다. 하지만 흥미로운건 사건의 개연성과 방법이 너무나 논리적이었기 때문에 퍼즐이 맞춰지는 쾌감이 있었다. 옴니버스로 진행되는 스토리에는 속도감이 있다. 매 스토리마다 살인사건을 해결하는데 필요한 지식들이 정말 놀라울 정도로 과학에 기반되어 보는 내내 신기했다. 또한 과학이 만들어낸 정밀한 살인사건임에도 그 스토리가 주는 오싹함 또한 좋았다. 죽은 치기공이 벼락과 합판을 이용해 자신이 죽었음을 알려 결국 범인을 잡게만든 일. 혹은 정말 유체일탈인 것 처럼 보인 빛의 굴절이 만들어낸 현상까지. 모든 현상의 원리를 정확히 알고 있기에 응용해서 글을 쓸 수 있었을 것이다. 나도 어떤 현상의 원리를 정확하게 알고있으면 이렇게 스토리와 잘 엮어서 글을 쓸 수 있을까? 추리소설이 아니더라도, 다른 사람들에게 정보를 전달하고 메세지를 주는 연습을 해야겠다. 추리소설 특성상 내용에 대한 리뷰자체가 스포일테니 기억이 나지 않으면 다시 책을 읽어보자. 다만 내용을 한 단어로 요약한 제목은 다시 제목을 보는 것 만으로 책 내용을 떠올리게 해줘 좋았다.

[book] 히가시노 게이고

이미지
[book] 히가시노 게이고 - D표시는 Drama. 연속드라마로 영상화된 작품 - SP표시는 Special Drama. 단편드라마로 영상화된 작품 - M표시는 Movie. 영화로 영상화된 작품 시리즈 가가 쿄이치로 시리즈 졸업 : 설월화 살인 게임 - 시리즈 첫작품 잠자는 숲 (SP) 둘 중 누군가 그녀를 죽였다 악의 (D) 내가 그를 죽였다 거짓말, 딱 한 개만 더(SP)[10] 붉은 손가락 (SP) 신참자 (D) 기린의 날개 (M) 기도의 막이 내릴 때 (M) 탐정 갈릴레오 시리즈 탐정 갈릴레오 (D) 예지몽(소설) (D) 용의자 X의 헌신 (M): 제6회 본격 미스테리 대상 소설부문 및 제134회 나오키 상 수상작. 성녀의 구제 (D) 갈릴레오의 고뇌 (D) 한여름의 방정식 (M) 허상의 도화사 (D): 국내 미출간 금단의 마술 (D): 국내 미출간 침묵의 퍼레이드: 국내 미출간. 갈릴레오 시리즈 20주년 작품 닛타 고스케 시리즈 매스커레이드 호텔 (M) 매스커레이드 이브 : 매스커레이드 호텔의 프리퀄 매스커레이드 나이트 명탐정 덴카이치 시리즈 명탐정의 규칙 (D) 명탐정의 저주 설산 시리즈[11] 백은의 잭 (SP) 질풍론도 (M): 2016년 11월 26일 아베 히로시 주연 영화 개봉. 눈보라 체이스: 국내 소미미디어로 출간. 연애의 행방: 원제는 <사랑의 곤돌라>. 시노부 선생 시리즈 오사카 소년탐정단 (D) 시노부 선생님, 안녕! 라플라스의 마녀 시리즈 라플라스의 마녀 (M) 마력의 태동: 라플라스의 마녀의 프리퀄 소설. 장편 방과 후 11문자 살인사건 (SP) 가면산장 살인사건: 반전소설계의 대명사로 알려진 대표작 중 하나. 직접 보기를 권한다. 게임의 이름은 유괴 (M): 영화명은 g@me. 공허한 십자가 나미야 잡화점의 기적 (M): 제7회 일본 중앙공론문예상 수상작, 201