분류 전체보기 260

0. Start of Web Frontend

강의 자료 블로그 https://heropy.blog/ HEROPY 웹디자인과 웹개발 기술을 공유하는 HEROPY 온라인 블로그입니다. 오프라인 지식 공유도 매회 진행합니다. 감사합니다. heropy.blog HTML: 뼈대를 담당하며 제목, 문단, 표, 이미지, 동영상 등을 정의하고 그 구조와 의미를 부여하는 정적언어로 웹의 구조를 담당한다. CSS: 색상, 크기, 폰트, 레이아웃으로 예쁘게 꾸미기를 담당한다. JS: 콘텐츠를 바꾸고 움직이는 등 페이지를 동적으로 꾸며주는 역할을 하는 프로그래밍 언어로 웹의 동적처리를 담당한다. HTML, CSS: 정적언어 (만들어져 있는 것만 갖고 화면에 표시한다.) JS: 동적언어 (상황에 맞게 꾸며 줄 수 있다.) 분업을 확실히 할수록 좋다.

Web Frontend/Basic 2021.05.29

19. 여러개의 ViewController를 한꺼번에 dismiss

회원가입이 완료되거나 긴 Segue로 연결된 ViewController를 한꺼번에 dismiss해야하는 경우가 발생한다. 처음으로 가는 방법인 것이다. 여기서 문득 의문이 생길 수 있다. Q. 그냥 마지막 페이지에서 첫 페이지를 present 하면 안되나?? A. 여러 페이지를 present한 경우 지금까지 거처온 페이지 들은 바로 뒤에 존재하고 있는 상태이다. 이는 resource 소모를 하고 있는 상태이다. dismiss를 한번 해보면 이를 바로 확인할 수 있다. 즉, 한꺼번에 여러 페이지를 dismiss 하는 것이 목적이다. 아래의 코드는 4페이지를 dismiss한 것이다. @IBAction func goFirstPage(_ sender: Any) { self.presentingViewControl..

18. UITextField underline

TextField의 경우 제공하는 4가지 형식 말고 다양한 구성을 원하는 경우가 있다. 그중 한가지가 아래와 같이 밑줄을 넣고 underline을 만드는 경우가 있고, 클릭되었을 때 반응하게 만드는 경우도 존재한다. 아래의 코드에서는 viewSize와 color을 파라미터로 받게된다. 자체적인 viewSize를 사용하는 경우 다양한 폰에서 textField의 크기를 인식 못한다는 점을 발견했다. 그래서 호출하는 당시에 view.bounds.width를 파라미터로 보내면 된다. color은 원하는 컬러를 호출하는 곳에서 결정하도록 만들었다. 예를 들어, emailTextField: UITextField 에서 수정을 "시작할 때 혹은 끝낼 때" 호출되는 함수에서 색을 지정해주면 위의 그림과 같이 수정된다. ..

17. currentFirstResponder

페이지를 구성하다보면 현재 FirstResponder이 누구인지를 판단해야 하는 경우가 발생한다. 그래서 직접 extension으로 구현해보았다. 원하는 상황에 currentFirstResponder()을 호출하게 되면 UIResponder에서 first에 해당하는 responder을 반환하게 된다. import UIKit extension UIView { func currentFirstResponder() -> UIResponder? { if self.isFirstResponder { return self } for view in self.subviews { if let responder = view.currentFirstResponder() { return responder } } return nil..

16. Normalization 정규화 - 규칙이 있는 String

다양한 페이지에서 String에 조건을 주고 싶을때 정규화를 사용할 것이다. 이때 정규화는 어떻게 구성되는 지를 설명하겠다. class Normalization { // 회원가입, 로그인 등 Normalization의 모든 검증을 하는 type method static func isValidRegEx(regExKinds: String?, objectString: String?) -> Bool { guard regExKinds != nil, objectString != nil else { return false } var regEx: String = "" switch regExKinds { case "name": regEx = "^[가-힣]{2,10}$" case "birth": regEx = "^[0-9..

15. 이용약관 동의 페이지

약관에 대한 내용을 DatailType의 case분류를 통해 확장성을 높힌것 같아 자랑하고 싶어서 올린다. 이용약관 상세페이지를 보려면 페이지를 이동하게 된다. 각 페이지에 약관 데이터를 넣는 것은 같은 형식의 코드를 여러번 사용해서 비효율 적이다. --> 약관동의에 대한 ViewModel로 데이터를 한번에 관리하고 어떤 case인지만 기재하면 된다. --> 약관 명을 보고 동의하는 페이지와 약관 상세페이지에서 동의하는 페이지 모두 동의한 것을 동일하게 인지하게 위해 instance property 보다 type property로 이를 선언하는게 용이하다고 판단함. 정답은 아니겠지만 생각을하고 코드를 짠다는 점 칭찬해~~ class TermsOfServicesViewModel { enum DetailTy..

13. When viewDidAppear and viewWillAppear are not called.

When viewDidAppear and viewWillAppear are not called. ViewController간의 이동을 한 뒤 다시 원래의 ViewController로 돌아오는 경우가 발생한다. 아래의 그림과 같이 ViewController에서 SecondViewController을 present하고 dismiss를 통해 다시 ViewController로 돌아오는 경우를 말한다. 이때 ViewController에서 viewDidAppear 과 viewWillAppear이 실행되지 않는 경우가 발생한다. 답은 fullScreen으로 불러오면 되는 것이다. ViewController을 옮기게 되면 위의 그림과 같이 화면이 존재하는 상태로 위를 살짝 덮는 형태로 되어있고, 뒤에있는 View는 A..

12. 선배가 알려주는 팁

1. 신입을 위한 팁 기술 블로그 GitHub 프로젝트 경험 서비스 출시 2. 신입 채용시 면접관 기대 태도 (열정, 배우려는 자세) 잘한다 (잘 할 것 같다, 빨리 배운다) 3. 경력 채용시 면접관 기대 태도 (기본적인 성품, 지원 회사에 대한 철저한 조사) 잘한다 (실제로 잘하는 영역이 있다, 기술적 문제를 어떻게 해결했는가) 비지니스를 안다 (사용자 가치에 대한 고민을 함께할 수 있는가, 사회적 관점으로 새로운 기술의 등장배경과 가치를 파악하는가) 4. 공부할 때 보는 사이트들 최신 article이 많다. https://nshipster.com/ 퀄리티 좋은 자료가 많지만, 유료이다. https://www.objc.io/ objc.io Latest Blog Post Learn SwiftUI layo..

7. 받아온 데이터를 Parsing하고 TableView에 띄우기

이제 받아온 데이터를 searchTerm에 넣기만 하면 된다. 현재 출력된 데이터는 snapshot.value에 해당하는 데이터이다. 우리가 필요한 것은 term과 timestamp를 키로 가지는 Dictionary 배열이 필요한 것이다. 우선 Dictionary array로 type casting을 시도하자. 우리는 사실 id를 필요로 하지는 않는다. 그래서 searchHistory의 values만 뽑아내서 사용할 것이다. 그JSON Decoder로 decode하여 [SearchTerm]으로 parsing 할 것이다. 다음과 같이 searchHistory.values를 Array로 type casting을 하고 decode할 데이터로 넣는다. 이때 SearchTerm의 배열형으로 parsing을 한다...

6. HistoryViewController 기본 작업

HistoryViewController 저장된 컨텐츠 목록 tabbar controller을 생성한다. Custom class로 지정한 뒤 TableView를 넣을 것이다. TableView에 TableViewCell을 추가하고 Label 하나만 넣자 간단하게 AutoLayout을 적용한 뒤 TableViewCell의 height를 86으로 지정하자. 셀 사이즈 지정이 가능함을 되새기기위해 사진으로 보여준 것이다. Custom cell을 만들어서 지정하고 Label과 searchTerm을 연결한다. 이제 HistoryViewController에 들어올 때마다 TableView의 reload 작업을 할려고 한다. 그렇다면 TableView를 변수로 담아놔야겠지 일단 데이터를 받아와보자 데이터를 정상적으로 ..

5. 검색어 서버에 저장하기

검색어 서버에 저장하기 우선 데이터베이스에 searchHistory를 추가시키고 db 변수는 이를 참조하도록 지정한다. 검색 결과를 담당하는 부분에서 작업하도록 하자. Id를 Firebase가 알아서 생성하도록 한다. 검색어를 넣는다. 검색한 시간 데이터도 넣는다. 시간 데이터는 Unix Timestamp를 이용한다. Unix Timestamp는 현재 시간을 유니크하게 표현해주는 놈이다. let timeStamp: Double = Date().timeIntervalSince1970 여기에서 값이 1049273.1438029 같은 수가 나오면 소수점 밑의 숫자를 제외시킬 것이다. 결과 다음과 같이 검색과 timestamp값을 firebase에 Write했음을 확인할 수 있다.