본문 바로가기
728x90
[Xcode Swift] Api 키 숨기기 api 키의 보안이 중요하기 때문에 git 에서 추적을 못하게 해줘야함config 에 키를 추가 해줌근데 이렇게 하면 안됐음,,프로젝트 파일에서 Config 파일을 추가해줌Release 는 배포용! info 에서 key, value 추가 Bundle 을 통해 키 사용 근데!Config 파일을 추적하면 안되는데 추적이 되어버림,,.gitignore 파일에서도 config 파일을 지우고 다시 add . commit 해주니 되었다 이건 그냥 주저리더보기이것도 안되면git rm -r --cached . 해서 git의 cache를 제거해주면 됩니다. 라고 함근데 캐시 삭제가 뭐임 참고한 블로그참고한 블로그2 2024. 6. 3.
[Swift] 알람앱 - 타이머(7) 로컬 푸쉬 알림 구현 사용자에게 알람 허용 요청앱을 가장 처음 실행 할 때 알림 허용을 요청해야합니다앱을 실행하고 가장 처음 보여지는 화면 viewWillApear 에서 알림 허용 요청 얼럿창을 띄어줍니다import UserNotifications  사용자에게 알람 허용을 요청할 메서드 구현let userNotificationCenter = UNUserNotificationCenter.current()override func viewWillAppear(_ animated: Bool) { requestNotificationAuthorization()}func requestNotificationAuthorization() { let authOptions = UNAuthorizationOptions(arrayLitera.. 2024. 5. 21.
[Swift] 알람앱 - 타이머(6) 최근 타이머 목록 저장, 삭제, 실행 최근 항목을 담을 빈배열 생성private var timerLists: [(time: Int, name: String?)] = [] Core Data에 타이머 최근 항목 저장코어데이터 모델을 만들어 줍니다타이머 이름과 시간만 저장하므로 두개 생성!주의사항! 엔티티 이름을 Timer 라고 했었는데 Swift 에 Timer 클래스가 이미 존재해서 오류가 났다 그래서 MyTimer 로 수정해줌 코어데이터 저장, 불러오기, 삭제 메서드 생성func saveTimer(name: String, time: Int) { guard let context = persistentContainer?.viewContext else { return } let myTimer = MyTimer(context: contex.. 2024. 5. 21.
[Swift] 알람앱 - 타이머(5) 테이블뷰 높이 동적으로 그리기 스크롤뷰 안에 테이블뷰를 넣으니 스크롤 안에 스크롤이 있는격이라 문제가 생겼다테이블뷰 높이를 설정해 주면 문제 없었지만내가 구현해 주고 싶은건 테이블뷰에 셀이 추가 되거나 삭제 될 때마다 높이가 달라져야 해서 함수를 만들어서 주었다func reloadTableView() { if timerLists.count 최근항목 리스트 배열에 아무것도 담기지 않으면 테이블뷰를 숨김합니다배열에 추가가 되면 테이블뷰를 보여주고 배열에 담긴 갯수만큼 테이블뷰를 그려줍니다기존에 그린 테이블뷰와 겹쳐서 오류가 날 수 있으니 remakeConstraints 로 다시 그려줍니다그리고 테이블뷰 리로드!   테이블뷰 셀을 그려준는 메서드에 위 함수를 추가해 줍니다func tableView(_ tableView: UITable.. 2024. 5. 21.
[Swift] 알람앱 - 타이머(4) 상태변화에 따라서 UI 변경 및 로직 구현(시작, 일시정지, 재시작, 취소) enum TimerState { case started case pause case resumed case canceled case finished}처음에는 케이스를 다섯개로 정했는데 사실 이렇게까지 필요 없었다 아래 세가지 경우만 있음타이머가 실행 되지 않을 때시간을 지정하지 않은 디폴트 상태타이머를 취소 했을 때타이머 실행시간 지정 후 실행일시 정지 후 실행일시 정지 기존코드// 기존코드if !isTimerRunning { self.setTime = Int(timerDurationPicker.duration) timerLists.append(String(setTime)) setTimer(with: setTime)} else { self.isTimerRunni.. 2024. 5. 16.
[Swift] 알람앱 - 타이머(3) - 타이머 초를 HH:MM:SS 포맷으로 보여주기 [Swift] 알람앱(2) - 초까지 나오는 타이머 라이브러리 사용하기 - DurationPicker 이전글에서는 시간을 설정하고 초가 줄어드는 것만 보여줬는데 이걸 시분초 포맷으로 바꿀까 한다 형식을 전환하는 메서드 형성func convertSecondsToTime(timeInSeconds: Int) -> String { let hours = timeInSeconds / 3600 let minutes = (timeInSeconds - hours * 3600) / 60 let seconds = timeInSeconds % 60 return String(format: "%02i:%02i:%02i", hours, minutes, seconds)} %02!(형식 지정자 설정)%: 형식 .. 2024. 5. 15.
[Swift] 알람앱 - 타이머(2) - 초까지 나오는 타이머 라이브러리 사용하기 - DurationPicker datePicker 연습,,더보기지정한 시간 프린트@objc func didTapStartButton() { print(#function) let setTime = Int(timerDatePicker.countDownDuration) // setTimer(with: setTime)}func setTimer(with countDownSeconds: Int) { print("countDownSeconds: \(countDownSeconds)")} 지정한 시간 끝나면 프린트 찍힘@objc func didTapStartButton() { print(#function) let setTime = Double(timerDatePicker.countDownDuration) // s.. 2024. 5. 14.
[Swift] 알람앱 - 타이머(1) - 타이머 UI UIView 에 올릴 때는 잘 올라갔는데 스크롤뷰에 올리니 갑자기 잘리는 현상이 나타났다원인은 DatePicker 를 올린 동그란 뷰의 위치를 제대로 잡아주지 않아서 그랬던거였다기존엔 뷰의 가운데에 잡아줬는데 그렇게 안하고 leading 과 training 값을 줘서 가운데로 위치 시켰다수정 및 고려사항- 알람 이름을 설정하는 것을 레이블로 하고 클릭시 텍스트필드가 있는 얼럿창을 띄워서 입력할건지, 아님 텍스트필드를 넣을 건지(아무래도 전자가 깔끔 할 듯)- Save 버튼 leading 값을 왼쪽에 있는 것에 잡으니까 끌려간다. 아무래도 허깅값을 줘야할거 같다- 데이터를 저장해서 테이블뷰 셀 확인할 것! 2024. 5. 13.
[Swift] 책 검색 App (10) - 무한 스크롤 지금까지는 기본 값인 1페이지의 책들만 불러왔는데 이젠 전체 페이지에서 검색값을 불러올까 싶다우선 어디서 다음 페이지를 불러올지를 생각해봐야한다간단하게 생각하면 스크롤이 끝나는 부분에서 불러오면 될거 같은데 스크롤이 끝나기 조금 이전에 다음페이지를 불러오면 좋을 것 같다테이블뷰 셀의 2-3개 높이 정도. 그러니까 스크롤이 250 픽셀 정도 남았을 때 다음 페이지를 불러오는 로직으로 짜보았다아래의 식으로 남은 스크롤 높이를 구할 수 있다남은 스크롤 높이 = 전체 콘텐츠 높이 - 뷰 상에서 보여지는 스크롤 높이 - 현재 스크롤 위치  전체 콘텐츠 높이let contentsSizeHeight = scrollView.contentSize.height  뷰 상에서 보여지는 스크롤 높이let scrollHeight.. 2024. 5. 11.
[Swift] 책 검색 App (9) 책 담을시 얼럿창 띄우기 https://i-go-ya.tistory.com/71 Swift Delegate 패턴 예제로 알아보기240430Delegate 패턴은 객체 간의 통신과 이벤트 처리를 위한 디자인 패턴 중 하나입니다. 주로 객체 간의 느슨한 결합(Loose coupling)을 유지하면서 하나의 객체가 다른 객체의 동작을 대신 처리할 수i-go-ya.tistory.com 제가 작성해 놓은 글이랑 아주 똑같은 상황이라 그대로 적용 했습니다 프로토콜 생성protocol DetailViewDelegate { func addBookalert(message: String)}파라미터에 담은 책 이름을 받을거예요 담기 버튼 누를시 델리게이트 사용하여 메서드 호출delegate?.addBookalert(message: addBoo.. 2024. 5. 9.
[Swift] 책 검색 App (8) - 최근 본 책 플로팅 버튼 (UIImageView 원형 만들기) 이미지뷰로 만들어서 클릭 하면 상세페이지로 가도록 구현해볼게요  UI 설정UIImageView로 만들고 오토레이아웃 잡아줍니다recentlyBookImageView.snp.makeConstraints { $0.trailing.equalToSuperview().inset(25) $0.bottom.equalToSuperview().inset(110) $0.height.width.equalTo(50)} 동그랗게 만들고 싶어서 설정하는데recentlyBookImageView.layer.cornerRadius = recentlyBookImageView.frame.size.width / 2도무지 이 코드가 안먹음 왜지 왜원인: Radius는 레이아웃이 다 완료된 뒤에 설정해야 하는데 내가 속성을 .. 2024. 5. 8.
[Swift] 책 검색 App (7) - 페이지를 모달로 띄울 때 주의사항 구현 사항 제대로 확인 안하고 냅다 메인화면 만든 나,, 필요가 없어져서 눈물을 머금고 지웁니다이거 그리면서도 배운게 있으니 그걸로 오케이,, 아니 낫오케이,, 암오케이,, 이제 탭바 두개야,,근데 사진 나란히 넣을 때 넓이 줄이고 싶은데 방법 아시는 분 댓글달아주세요  의문의 빨간색 상단바 없애기 스크롤을 하게 될만큼 길어지면 상단에 공간이 띄어짐,, 스크롤 안해도 되면 꽉 채워짐,, 도대체 왜,,?빨간색으로 보이는 부분은 스크롤뷰인데 왜저러는지 모르겠다,, 문제의 원인부터 말하자면 페이지를 띄울 때 모달로 띄웠는데 네비게이션으로 띄웠기 때문이었다Hierachy 를 보니 의문의 빨간바가 가장 상위에 떠있음UIVisualEffectBackdropView?이게 뭔데 나 만든적 없는데? 했는데 네비게이션 자.. 2024. 5. 8.
Xcode UI 미리보기 (프리뷰) 설정 냅다 따라한 블로그 주소 넣겠습니다https://wood-fxrest.tistory.com/121 Xcode | UIKit 미리보기(Preview) 기능먼저, UIKit에서 SwiftUI처럼 미리보기(Preview)를 사용하고 싶으면 위 사진과 같이 SwiftUI 파일을 만들어줘야 합니다. 파일 생성 후 아래의 코드를 붙여넣어 주세요. #if DEBUG import SwiftUI extension UIViewContrwood-fxrest.tistory.com 근데 버전 17.0 부터 훨 간단한 방법이 나왔습니다#Preview { 해당컨트롤러() // 해당 컨트롤러 // 화면 업데이트: command+option+p}이거 원하는 뷰컨에 넣으면 끝~ 2024. 5. 8.
[Swift] 책검색 App (6) - 담은 책 삭제 (CollectionView Cell 삭제) 삭제하시겠습니까 알림창도 안띄워주는 불친절한 앱이지만 일단 삭제가 됩니다! 아래 사진 처럼 편집을 누르면 선택한걸 보여주고 삭제까지 해볼게요  삭제시 선택셀 하이라이트 만들기 멀티셀렉션으로 하다가 포기한.. 기록이라도 남겨 놓습니다더보기let highLightView = UIView()저 노란 선택택 표시를 위해 uiview 를 생성해줬습니다highLightView.snp.makeConstraints { $0.edges.equalToSuperview()}컨텐트뷰 전체로 오토레이아웃 잡아줬어요highLightView.backgroundColor = .ybyellowhighLightView.layer.opacity = 0.3highLightView.layer.borderColor = UIColor.yb.. 2024. 5. 7.
[Swift] 책검색 App (5) - 책을 담았을 때 목록에서 확인하기 (feat. reloeadData 와 View Controller의 생명주기) 담기 버튼 누르면 담은 항목을 보고 싶음reloadData 로 하면 된다는걸 알긴하는데,, 우여곡절 리로드데이터하기 시작,,1트처음에는 라이브러리뷰컨 데이터 셋팅하는 메서드에다가 리로드를 했는데 안들어옴근데 이건 또 가끔은 된다 왜...?  2트셀에다가 리로드를 하면,,,,?조져따빠르게 앱종료 3트그럼 담기버튼 누를때 리로드 하면?안돼요 4트야호 돼요 돼!!!!!!!!11 이유는 뷰 생명주기를 모르는 내탓,,원래는 setBookList 메서드에 리로드를 하고 이 메서드는 viewDidLoad 에서만 호출 되었었다근데 viewDidLoad 는 딱 한번만 호출됨!그러니까 앱을 껐다 켜면 리스트에 들어오지만 앱을 계속 실행하고 있는 상태에서는 콜렉션뷰가 리로드 되지 않았다그래서 viewWillAppear 에.. 2024. 5. 7.
[Swift] 책검색 App (4) - 상세페이지로 이동, CoreData 로 책 담기 검색한 책을 클릭하면 상세페이지로 이동하는 것과 코어데이터로 책을 저장해보겠어요,, 책 선택하면 상세페이지로 띄우기셀 선택시 상세페이지로 이동func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectBook = searchBookDocuments[indexPath.row] let detailVC = DetailViewController() detailVC.selectBook = selectBook let navigationController = UINavigationController(rootViewController: detailVC) .. 2024. 5. 7.
[Swift] 책검색 App (2) - Tab Bar 이번 포스팅에서는 탭바를 만들어볼게요 탭바 설정은 SceneDelegate에서 할거예요 연결 할 뷰 객체 생성let firstViewController = UINavigationController(rootViewController: MainViewController())let SecondViewController = UINavigationController(rootViewController: SearchViewController())let ThirdViewController = UINavigationController(rootViewController: LibraryViewController()) 탭바컨트롤러 생성let tabBarController = UITabBarController()tabBarCo.. 2024. 5. 5.
[Swift] 책검색 App (1) - 네트워크 통신 kakao Developers 책검색 api 를 활용해서 책 검색앱 만들기!네트워킹부터 해볼게요,,api key 를 받고 활용법 확인하기https://developers.kakao.com/ Kakao Developers카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.developers.kakao.com가입한 후 api key 를 받아줍니다 인증방식이 REST API키 라고 하네요 !헤더에 Authorization 를 넣는건 필수고쿼리파라미터 중에 query .즉 검색값도 필수로 넣어줘야한다고 합니다 당연하죠 검색 api니까 검색 값이 있어야겠죠  데이터 확인하기 데이터를 확인할 수 있는 프로그램들이 있는데 저는 i.. 2024. 5. 5.
Swift 버튼 좌측에 이미지 넣기 시도하다가 포기하고 UIView 로 그린썰 푼다 240503메인화면에 페이크 서치바를 만들었는데저걸 누르면 그냥 검색페이지로 이동하는걸 해보고 싶었다,,그래서 버튼으로 만들었더니 곧 죽어도 이미지가 가운데에만 박혀 있음,,,왼쪽으로 넣을려면 텍스트를 같이 넣어주거나 하는 방법 밖에 없었다 ㅠ그래서 UIView 위에 이미지를 올리는 걸로 합의봄 서치바에 기본으로 있는 돋보기랑 똑같은 크기로 하고 싶었는데 안됨ㅠ 거의 비슷하게 맞추고 후퇴,,,저거 눌렀을 때 검색페이지로 이동시키는 로직 짜야함 휴 2024. 5. 4.
Swift 버튼에 시스템 이미지 크기 바꾸기 240503왜 내 버튼의 이미지는 항상 요지부동일까,, 자 한번 바꿔보자어떻게 해도 꿈적도 안하는 하트,,let likeButton: UIButton = { let button = UIButton() let imageConfig = UIImage.SymbolConfiguration(pointSize: 100, weight: .light) let image = UIImage(systemName: "heart", withConfiguration: imageConfig) button.setImage(image, for: .normal) button.tintColor = .gray return button }()Sym.. 2024. 5. 4.
Swift Asset 에 사용할 색상 저장해 놓고 쓰기 240503Assets 에 들어가서 + 버튼을 눌러 Color Set 선택 Any Appearance 를 클릭하여 우측 인스펙터 영역에서 컬러 설정을 해줍니다아마 Dark 는 다크모드 일 때 색상 지정하는거일 듯? 맞나요  Input Method 에서 가져온 컬러값대로 옵션 선택해서 값을 넣습니다색을 직관적으로 보려면 아래에 Show Color Panel 를 클릭해 창을 열어서 컬러값을 확인하면서 넣으면 됩니다컬러이름은 맘대로 설정하십시오넣을 컬러가 많다면 폴더에 넣어주십시오  짜잔 이제 내 컬러가 검색이 된다!! 2024. 5. 4.
Swift codebase UI - ToDOList UserDefaults 로 데이터 저장하기 240502지난 투두리스트 만들 때는 스토리보드로 만들었는데 이번에 코드만으로 만들어 봤다UI 도 좀 바꿔서 함  화면 구성 Snapkit 사용화면 상단 TextField 에 위치시키고 내용을 적고 키보드 상에서 Done을 누르면 리스트가 추가 됨Userdefaults 로 데이터 저장스와이프로 삭제(이건 아직 안함!!)할 일 완료시 리스트 하나를 클릭하면 취소선, 텍스트 회색으로 바뀜 코드 짠 순서대로 기록해 볼까 한다 Struct 생성struct Task : Codable { let title: String // 타이틀. 할 일 내용 var done: Bool // 완료 여부}  담을 빈 배열 생성var toDoList = [Task]()  텍스트필드, 테이블뷰 생성let textField .. 2024. 5. 3.
Xcode Simulator textfield 눌러도 키보드가 안나올 때 텍스트필드 만드는데 아무리 해도 키보드가 안올라오는 것이다!!!!!!!!!!!!!!!!!!!!!!!!!근데 알고보니까 xcode 오류악!!!!!!!!!!시뮬레이터 선택 한 뒤 I/O 에서 Keyboard - Connect Hardware Keyboard체크 했다가 다시 텍스트 필드 눌러보고 안돼서 체크 해제 하고 눌러보니 됐다이거 때문에 한시간 동안 이것 저것 해봄,, 2024. 5. 2.
Swift 스토리보드 없이 코드로만 UI 그릴 때 셋팅 240502스토리보드 삭제info.plist 에서 Storyvoard Name ( - ) 버튼 눌러서 삭제TARGETS - Build Settings - UIkit Main Storyboard File Base Name 삭제SceneDelegate 설정guard let windowScene = (scene as? UIWindowScene) else { return }window = UIWindow(windowScene: windowScene) // SceneDelegate의 프로퍼티에 설정해줌let mainViewController = ViewController() // 맨 처음 보여줄 ViewControllerwindow?.rootViewController = mainViewControllerwindo.. 2024. 5. 2.
Swift TMDB api 네트워킹 연습 240501 벌써 5월이라니 믿을 수 없음 입니다 TMDB 에서 api 키를 발급 받습니다.방법은 다른 블로그에 많으니까,,  프로젝트 때 영화 목록만 봤던게 지겨워서 TV 로 받아올까 싶습니다간단하게 타이틀이랑 이미지만 받아 올게요UI는 Snapkit 으로 그렸습니다데이터 모델 생성원하는 걸 선택한 뒤 REQUEST 창에서 TRY It! 을 눌러 REPONSE 창에서 데이터들을 불어옵니다요기에 복붙해주면데이터 모델을 자동으로 생성해 줘요import Foundation// MARK: - Welcomestruct Welcome: Codable { let page: Int let results: [Result] let totalPages, totalResults: Int enum Cod.. 2024. 5. 2.
Swift Delegate 패턴 예제로 알아보기 240430Delegate 패턴은 객체 간의 통신과 이벤트 처리를 위한 디자인 패턴 중 하나입니다. 주로 객체 간의 느슨한 결합(Loose coupling)을 유지하면서 하나의 객체가 다른 객체의 동작을 대신 처리할 수 있도록 합니다.솔직히 느슨한 결합이 뭔말인지 모르겠다더보기느슨한 결합(Loose coupling)은 객체 간의 의존성을 최소화하여 각각의 객체가 독립적으로 존재할 수 있도록 하는 소프트웨어 디자인 원칙입니다. 이것은 소프트웨어를 더 견고하고 유연하게 만들어줍니다.느슨한 결합을 유지하는 것은 객체 간의 상호작용을 최소한으로 제한하고, 각 객체가 다른 객체에 대해 가능한 적은 정보를 알도록 하는 것을 의미합니다. 이를 통해 다음과 같은 장점이 있습니다:유연성(Flexibility): 객체가 .. 2024. 4. 30.
Swift codebase UI 그리기 내 버튼 왜 클릭 안돼 24.05.27프로젝트 끝나고 작성하는 TIL 어제 한거니까 YIL 인가,, 쨌든하루지나 팀프젝 열어봤는데 날짜가 잘 들어오구 있군 곧 문닫는 티켓킹 소극장 5월 1일까지밖에 날짜가 안떠있다 하여간 문제를 말해보자면문제저기 날짜 버튼이 아무리 클릭해도 반응이 없는 것임!클릭이벤트는 항상 버튼이 한다고 생각해서 커스텀 셀에 버튼을 올려뒀는데사실 저건CollectionView 로 만들어서 그냥 didselect 하면 되었다 근데 로그 찍어도 반응이 없는것임!위에 날짜 Label 을 올려서 그랬나 싶었는데 문제는 아주아주 다른 곳에 있었다 이유바탕에 깔린 저 민트색 배경은 직접 그린게 아니라 그냥 이미지로 넣었는데 그게 문제 였던 것모오오오오ㅗㅗㅗ든건 부모뷰에서 상속 받는건데 이미지뷰는 클릭 행위?를 할 수 .. 2024. 4. 30.
Swift codebase UI 스크롤뷰가 있는 화면 하단에 버튼 고정하기 하단의 예매하기 버튼은 스크롤시 움직이면 안되고 항상 바닥에 있어야 해요그걸 고려했다면 처음에 버튼부터 만들었을 것 같은데 저는 스크롤뷰부터 만들어서 이미짠 코드를 수정해야했습니다let bottomView = UIView()let buyTicketButton = UIButton() 버튼이 꽉차게 있는게 아니라서 뷰를 밑에 깔고 그 위에 버튼을 그려볼게요생성 먼저! view.addSubview(bottomView)bottomView.addSubview(buyTicketButton)view.addSubview(scrollView)addSubvuew 를 넣을 때는 위에서부터 순서대로 작성하는데요포토샵의 레이어 처럼 하나씩 쌓아 올린다? 라고 보면 될 것 같아요 우선 버튼 밑에 깔리는 바탕뷰를 view 에다가 .. 2024. 4. 25.
Swift codebase UI 그리기 TableVeiw 영화관 선택부분을 테이블뷰로 그려볼까합니다let choiceCinemaLabel = UILabel()let cinemaTableView = UITableView() 일단 영화관 선택 레이블이랑 테이블뷰 생성! contentView.addSubview(choiceCinemaLabel)contentView.addSubview(cinemaTableView)contentView 에 넣어줍니다왜 여기다 넣어주는지 모르겠다면 이전 포스팅 참고해주셔요 cinemaTableView.delegate = selfcinemaTableView.dataSource = self절대 잊지 말것,,,,이거 까먹어서 내 셀 어디갔지 한적이 한두번이 아닌.,..  choiceCinemaLabel.snp.makeConstraints { .. 2024. 4. 25.
Swift codebase UI 그리기 ScrollView 넣기! let scrollView = UIScrollView()let contentView = UIView()스토리 보드로 그릴때 스크롤뷰 하위에 contentView가 있던게 생각나서 넣어줌view.addSubview(scrollView)scrollView.addSubview(contentView) addsubview 도 물론 넣어주고여기서 중요한건스크롤뷰는 view 안에 넣어줘야한다 view 는 우리한테 보여지는 딱 화면 크기만큼을 뜻한다contentView 는 스크롤뷰 안에 넣어준다 그리고 안에 들어갈 모든 요소는 contentView 에 addsubview 해줘야함!! scrollView.snp.makeConstraints { $0.top.equalToSuperview().inset(40) $.. 2024. 4. 25.
728x90