SeSAC 과제를 하다가 특정 뷰컨트롤러로 넘어갈 때 Navigation Bar가 보이지 않게끔 설정해야 할 때가 있었습니다. 들어가기에 앞서 ViewController의 생명주기에 대해 살펴 보고 넘어가겠습니다! viewDidLoad()와 viewWillAppear()를 살펴보면 viewDidLoad() 뷰계층이 최초 메모리에 로드 된 후 호출되는 메서드 메모리에 처음 로딩 될 때 1회만 호출된다. viewWillAppear() 다른 뷰에 갔다가 다시 돌아오는 상황에 해주고 싶은 처리에서 사용한다. viewDidLoad()와 구분할 것 이렇게 설명을 할 수 있습니다. 네비게이션바를 특정 뷰컨에서 없애는 것과 이게 무슨 관련이 있는데? 라고 의문이 드실텐데요. 위의 사진에서 보듯이 viewDidLoad(..
이 글을 쓰게 된 이유는 ... 무엇일까요 ... 배열에서 랜덤으로 가져와야 하는 부분이 있었는데 코드를 보시죠 .. @IBAction func tapQuoteGenerationButton(_ sender: Any) { // 0 ~ 4 사이의 난수를 생성 let random = Int(arc4random_uniform(5)) let quote = quotes[random] self.quoteLabel.text = quote.contents self.nameLabel.text = quote.name } 버튼을 클릭하면 배열의 값을 받아 랜덤으로 바뀌는 부분이었습니다..! 서론이 길었으니 ,, 본론으로 바로 가시죠 Swift에서 제공하는 랜덤함수에는 세가지가 있습니다. arc4random() arc4rand..
사실 이 부분을 정리하게 된 가장 큰 이유는 라벨 텍스트에 값을 받아오는 부분이 있었는데 오토레이아웃을 어떻게 잡아야 할지 생각이 많았었다. UIView 안에 라벨을 넣는데 만약 라벨이 길어지면 UIView에 보기 좋게 차지 않으니까 두 오브젝트의 우선순위를 비교해서 UIView가 늘어난다면? 이란 생각을 가지고 공부를 하게 되었다. Content Hugging priority - 최대 크기에 대한 제한 - 우선순위가 높으면 내 크기 유지. 우선순위가 낮으면 크기 늘어남 - 250단위로 사용 가능 Compression Resistance priority - 최소 크기에 대한 제한 - 우선순위가 높으면 내 크기 유지. 우선순위 낮으면 크기 작아짐 - 250단위로 사용 가능 두 오브젝트 중 하나가 커져야 하..
음 우선 제목을 이렇게 지어도 되는지 모르겠지만 ,, 위의 동영상을 보시면 텍스트필드의 텍스트값이 변함에 따라 동시에 밑에 라인과 라벨이 생기는 걸 알 수 있습니다! 코드를 보면 (정규식도 사용을 해서 밑에 코드에 생략된 부분이 많습니다 ...) private func actionEmailTextField() { emailTextField.addTarget(self, action: #selector(SignUpFirstViewController.textFieldDidChange(_:)), for: UIControl.Event.allEditingEvents) } private func actionPasswordTextField() { passwordTextField.addTarget(self, action..
보통 회전목마 라고 많이 하는데 수평방향으로 스크롤되는 뷰이다. 스크롤뷰를 사용해서 구현하는 방법, 컬렉션뷰를 이용해서 구현하는 방법이 있는데 이번에는 컬렉션뷰를 이용해서 구현해보겠다. 모든 앱에서 흔히 쓰이는 기능이라 알아두면 좋을 것 같다! 순서를 차근차근 설명해보겠다 ! 내가 만드려고 하는 뷰는 요런 뷰이다! 가운데뷰 양옆 뷰에 알파값, 사이즈를 조절해야한다..! 이게 무슨 소리인지 모르겠으니,, 구현한 모습을 보겠다! 이런 모습이다..! 이것을 활용해서 만들 수 있는 것이 다양하니 알아두자..! // // MoodViewController+Carousel.swift // Mohaeng // // Created by 김승찬 on 2021/09/16. // import UIKit class Carou..
assert - 특정 조건을 체크하고, 조건이 성립되지 않으면 메세지를 출력 하게 할 수 있는 함수 - assert 함수는 디버깅 모드에서만 동작하고 주로 디버깅 중 조건의 검증을 위하여 사용한다. guard 문 - 뭔가를 검사하여 그 다음에 오는 코드를 실행할지 말지 결정 하는 것 - guard 문에 주어진 조건문이 거짓일 때 구문이 실행됨 assert import Foundation var value = 0 assert(value == 0) value = 2 aseert(value == 0, "값이 0이 아닙니다") playground에서 코드를 작성하고 실행하면 런타임 에러가 발생한다. assert 함수는 값을 실행하고 조건이 맞지 않으면 에러를 발생시키는 함수기 때문에 이렇게 나온다. guard ..
릴리즈를 준비하면서 카카오톡 소셜 로그인 뷰를 맡아서 미리 공부를 해보았다! 스터디하면서 구현을 했었던 적이 있었는데 그 때 엄청 꼬여서 애를 먹었었는데,, 이번에는 천천히 구현을 해보겠다..! 시작하기 전에 카카오 로그인은 사용자를 인증하고 토큰을 발급하는 기능이다. 토큰은 액세스 토큰(Access Token)과 리프레시 토큰(Refresh Token) 두 종류이다. 액세스 토큰은 사용자 정보 기반의 API를 호출하는 데 쓰이고, 리프레시 토큰은 일정 기간동안 사용자 인증 절차를 거치지 않고도 액세스 토큰을 갱신할 수 있도록 해 준다. 사용자의 카카오계정을 인증하는 방식에 따라, iOS SDK를 사용한 카카오 로그인 구현 방법은 두 가지로 나뉜다. 카카오톡으로 로그인 기본 웹 브라우저(Default B..
2021.08.20 - [Sopt 28th 세미나 - iOS] - Alamofire (GET) & Postman Alamofire & Postman POSTMAN 서버가 구현한 API를 테스트 할 수 있는 플랫폼 포스트맨은 서버 데이터가 현재 어떻게 나오고 있는지 파악하기 위해서 테스트 용도로 사용! 혹은 response body 확인 -> 멀쩡하게 이미지가 출 seungchan.tistory.com 2021.08.20 - [Sopt 28th 세미나 - iOS] - Alamofire (POST) Alamofire (POST) POST LoginDataModel.swift import Foundation // MARK: - LoginDataModel struct LoginDataModel: Codable ..
LoginDataModel.swift import Foundation // MARK: - LoginDataModel struct LoginDataModel: Codable { let success: Bool let message: String let data: UserData? enum CodingKeys: String, CodingKey { case success case message case data } init(from decoder : Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) success = (try? values.decode(Bool.self, forKey: .success)) ?? false..
세미나에서 서버 통신 할 때 뇌절이 와서,, 제대로 못했던 기억이 난다... 2021.08.20 - [분류 전체보기] - Alamofire & Postman Alamofire & Postman POSTMAN 서버가 구현한 API를 테스트 할 수 있는 플랫폼 포스트맨은 서버 데이터가 현재 어떻게 나오고 있는지 파악하기 위해서 테스트 용도로 사용! 혹은 response body 확인 -> 멀쩡하게 이미지가 출 seungchan.tistory.com 너무 양이 방대해서 핵심만 짚고 넘어가보겠다 ! 1. NetworkResult.swift -> 네트워크 결과를 나누기 위해 enum 형으로 선언 2. XXXDataModel.swift -> JSON 데이터를 담아내기 위해 데이터 구조체를 만들고 Codable 채택..