목록Swift (34)
광어네 맛집
이번 글은 간단하게 한번 적어두면 좋을 거 같아서 적어봅니다 대부분 Delegate로 어떤 값을 전달할 때나 View Rule을 정할 때 Protocol을 주로 사용하죠? Protocol은 필수나 Optional로 설정해 줄 수 있어요 우선 Swift 파일에서 Objective C에서 같이 사용하고자 하면 코드는 다음과 적으시면 됩니다 @objc protocol fooDelegate { @objc optional func didFinishCompletion(name: String, age: Int) } 이렇게 적으시면 Objective C에서도 사용하지 않거나 사용할 수 있어요 그렇지만 단점은 Objective C에서 지원하지 않는 Object를 Parameter에 넣게 되면 에러가 뜹니다ㅜㅜ 이럴 경우..
fastlane을 혼자 쓰다가 같이 사용할 일이 생겨서 추가 작업이 필요해졌어요 인증서 관련 작업인데 Gitlab에 올려두고 같이 쓰기로 했어요 Match를 이용하여 인증서를 올리는 방법은 간단합니다 /// 초기화 fastlane match init /// 저장소 선택 Gitlab 이더라도 1.git을 선택하시면 됩니다 /// 해당 matchFile을 알맞게 수정 git_url("https://gitlab") storage_mode("git") type("development") type("appstore") app_identifier(["com.kwangho.tistory"]) username("광어") 참고로 Gitlab에서 새로운 레포를 하나 생성한 뒤 진행했어요 /// Apple Developme..
다양한 방법으로 작업하다보면 스토리보드에서 화면이 제대로 나오지 않는 경우가 있습니다 그럴때면 Xcode 를 껐다가 켜보아도 아무런 반응이 없거나 무한 로딩이 걸리면 난감하죠.. 찾아도 navigation을 제대로 연결해주었는지에 대한 글만 있어서 저희 프로젝트에서만 일어나는가 싶기도 했는데 해결법은 상당히 간단했습니다! 1. 우선 DerivedData를 삭제해줍니다! 2. Xcode를 완전히 종료해주세요 3. 이제 맥!북!도 완전히 종료해주세요 4. 다시 맥북을 켜고, Xcode 를 실행시켜보면 다음과 같이 로딩 후 잘 나오게 됩니다 결과 화면은 생략!
오랜만에 글쓰는 거 같아요 많고 많은 일이 있었지만 잘 정리되어가는 거 같아 한시름 놓여요 이번 글은 외부에 테스트 앱을 전달할 때 생긴 이슈입니다 다들 외부에 테스트 앱을 전달할 때 TestFlight를 주로 사용하실텐데 TestFlight 말고도 여러 가지 방법으로 테스트 앱을 전달할 수 있는 걸 아시나요 요번에 새롭게 알게 된 건데 (준비사항 있음) ipa 파일만 있으면 앱을 설치해서 테스트할 수 있어요 Mac App에서 Apple Configurator를 사용해서 아이폰에 설치할 수 있더라구요 이걸 사용하기 전에 apple Developer 홈페이지 > 계정 > 기기 에서 해당 UDID를 등록해주어야 합니다 아니면 '무결성을 확인할 수 없기 때문에 설치할 수 없습니다' 라고 알림이 떠요 이후 아카..
이번 포스팅은 쉬운 거 같지만 막상 하려면 헷갈리는 점선 그리는 방법을 알아보도록 하겠습니다! 그리고 Swift 랑 Objective C 둘 다 적어보고자 합니다! let dotLine = UIView(frame: CGRect(x: view.bounds.midX , y: view.bounds.midX, width: 100, height: 100)) override func viewDidLoad() { ... dotLine.backgroundColor = UIColor.black.cgColor view.addSubView(dotLine) ... } 우선 View 를 선언해줍니다 편의를 위해서 미리 view를 그려줬어요! 이후 CAShapeLayer 와 UIBezierPath 를 이용할건데 CAShaperL..
앞에서 쓴 글과 이어서 작성하고자 합니다 이번 글은 조금이나마 깊게 들어가고자 합니다! UIView 내부에 업데이트 메서드는 SetNeedsDisplay, SetNeedLayout, displayIfNeeded, layoutIfNeed 있습니다 살펴보기 전에 UIKit이 어떻게 나온지에 대해서 살펴봐야 할 것 같습니다! 제일 상단에 보이는 UIKit 은 아래 low Level 인 그래픽 API 들을 거쳐 High Level로 만들어진 그래픽 API 입니다! 타 블로그 분들께서는 Metal로 나온 부분은 OpenGL이라고 칭하셨습니다! 무튼 앱이 부드럽게 그려지기위해서는 60FPS 를 유지해야 합니다 이를 위해 Graphics Hardware를 사용하는데 Low Level로 많은 코드, 가장 빠른 Open..
이번 글은 과제를 하면서 실수, 의문점이 드는 것들을 정리 및 회고하고자 합니다! 아마 범위가 넓어서 두번 정도 나눠서 적을 예정! 우리는 Xcode에서 Cocoa Touch Class를 통해서 ViewController를 생성할 때면 viewDidLoad()라는 메서드가 override가 자동으로 만들어지게 됩니다 UIView를 생성할 때는 어떤 문구가 주석처리되어 만들어지는데 /* // Only override draw() if you perform custom drawing. // An empty implementation adversely affects performance during animation. override func draw(_ rect: CGRect) { // Drawing cod..
진짜 갑자기 몸살에 장염에 걸려서 죽을 뻔 ... 아프지만 글은 남기고 싶은게 있어서 포스팅 작성함! 오늘은 SPM에 대해서 살펴볼까 함 흔히 우리가 SPM을 사용하는 방법은 Xcode -> Project -> Package Dependancies -> '+'로 추가해서 사용함 근데 만약 Target이 여러개일 때나 각각 framework가 사용하고 싶을 때가 있을 거임 물론 Pods로 분기처리 해줄 수도 있지만 SPM도 가능은 하다~ 방법은 Xcode -> File -> New -> Package 를 눌러주면 이름과 어디에 저장할지가 나오는데 Git Repo에 올려서 사용하고 싶으면 아래 화면처럼 선택해주고 생성해주면 된다! 그럼 아래처럼 파일이 만들어지는데 하나씩 뜯어보면 간단하다! 먼저 맨 위에서..
요번 포스팅은 SwiftUI frame 오류에 대해서 알아보자 합니다! 간단한거라 바로 알아봅시다! 상황은 개별적인 View를 만들어 ContentView에 보여주고자 하는 상황! SwiftUI는 .infinity로 해주면 알아서 전체로 잡아주는 게 아니였낭..? 근데 보라색 경고가 뜸 ㅜ ( 너 frame 수치가 정확하지 않는데? ) 그래서 아래처럼 바꿔봄 역시 이랬더니 경고 표시는 사라짐! 근데 HardCoding 하기가 싫어서 아래처럼 Swift 형식으로 보내봄! 당연히 이것도 경고 표시는 사라진다! 그치만 이건 온전한 SwiftUI가 아닌걸... 그렇다면 어떻게 할까? 방법은 'GeometryReader' 를 같이 사용하면 됩니다! // body 내부 GeometryReader { proxy in..
모두들 맛점하셨나요 ㅎㅎㅎ 드디어 CoreData의 끝이 보입니다! (사실 Data 수정도 하고 할건 많음 ㅋ) 이건 쉬우니 바로 봅시다! 안에 Entities 나 attributes를 바꾸면 무섭게 에러다!! 이렇게 발생할거에요 그러면 당황하지 말고 디버깅 영역 체크해보면 마이그레이션 안해줬어 ㅡ3ㅡ 이런 메시지를 보게 됩니다! 그럼 저희는 마이그레이션을 해줘야겠죠? ㅎㅎㅎ 먼저 Version 을 하나 추가 해줍니다! 그럼 위 사진처럼 Version 이름이랑 Base model이 나옵니다! 보통 Version에 숫자만 붙이니 이대로 냅두고 Finish를 눌러줍니다! 그럼 상단 탭에는 생겼는데 오른쪽 네비게이터에는 없네요? 띠용 아니에요 ㅋㅋㅋ 옆에 열어서 보면 있습니다! 녹색 체크 버튼을 옮겨줍니다 (..
이번 포스팅은 간단히 알려주고 넘어갈 예정! 사실 제가 회사에 Fastlane 처음 도입해서 혼자 관리하고 있습니다! ( 내가 알아낸 정보 내가 공유해야쥐 ㅎㅎ) 테스터 추가까지 좀 더 편하게 업로드 할 수 있지 않을까 라는 생각에 찾아봤는데 있더라구요? 생각보다 간단함! latform :ios do desc "TestFlight 올라갑니당" lane :testFlight do increment_build_number(xcodeproj: "프로젝트 이름.xcodeproj") build_app(workspace: "프로젝트 이름.xcworkspace", scheme: "스키마 이름") upload_to_testflight( changelog: " 앱 테스트 환경 및 수정 사항 - 코드 수정 및 최적화 적용..
요즘 날씨가 왔다리 갔다리... 왜이렇게 더운지 무튼 ! 이번 포스팅은 예전 포스팅과 연결하여 SQLite 보는 툴 및 Relationships에 대해서 적어보자 합니다! 이전 포스팅 마지막에서 SQlite로 데이터를 저장하고 위치까지 알아봤죠? 그럼 SQLite는 어떻게 열어보냐? 바로 SQLiteBrowser를 이용해서 열어보시면 됩니다! 다운로드 사이트는 https://sqlitebrowser.org/dl/ Downloads - DB Browser for SQLite (Please consider sponsoring us on Patreon 😄) Windows Our latest release (3.12.2) for Windows: Windows PortableApp Note - If for any..
CoreData를 파다 보니까 포스팅하고 싶은게 자꾸 늘어나네요 ㅎㅎㅎ 간단한 거니까 가볍게 읽고 가봐요 (제가 잘못 생각한 부분은 언제든 피드백 환영입니다!) 우선 CoreData는 CoreDataStack으로 되어 있는 Framework라고 합니다! Stack은 아래 그림처럼 구성되어 있습니다 Container 안에 Context, Coordinator, Model 이 들어가 있는 걸 볼 수 있습니다 앞 포스팅에서 CRUD만 구현하기 위해서 무작정 적었다면 이제는 이해하면서 사용할 수 있습니다! 1. Persistent Container Stack에 필요한 객체들을 모아둔 곳입니다! 여러가지들을 차례대로 알아봐요 2. Managed Object Model 모델은 저장하고 싶은 Data를 저장하는 객체..
SwiftUI도 어느정도 본 것 같고 심화로 들어가다 보니 SwiftUI 한계에 부딪히게 되는 것 같다 그래서 사용하게 된 CoreData! 물론 Realm 쓰면 간단하게 사용할 수 있는데 라이브러리를 많이 쓰면 안좋으니까! 처음에 Xcode를 만들 때 CoreData 체크 후 만들면 AppDelegate에 아래 처럼 자동으로 생기게 된다! // MARK: - Core Data stack lazy var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "test") container.loadPersistentStores(completionHandler: { (storeDescription, ..
오랜만에 포스팅이네유 ㅜㅜ 회사 일도 있고 너무 바빠서 정신이 없... 오늘은 Swift UI Preview error에 대해서 다루고자 함! 빌드는 되는데 Preview는 안나온다? 그러면 다음과 같은 확률이 큼 상황 : Grid를 사용하려고 GridItem을 만드는 과정에 발생! Preview Error Message Error: Compiling failed: consecutive statements on a line must be separated by ';' 해결법은 대충 ';' 로 구분을 해줘라! 임 ObjC 해봤으면 ' ; ' 은 알고 있을 거임! (끝맺음 표시해주는 뜻!) 근데 보기에 너무 안 예쁘고 ;(세미콜론)은 ObjC 에서만 쓰기로 해요 ㅎㅎ 그래서 다음과 같이 바꿔줌! 또는 var..
오랜만에 포스팅이네! 이번 포스팅은 계속 까먹는 거 같아서 포스팅해두려고 함 참고로 곧 Swift UI 포스팅도 해야겠다! 일단 priority를 설정하면 높이나 너비를 알맞게 해줄 수 있는 걸 알고 있을거임 그러면 중간에 vertical spacing 을 준 뒤 각 레이블 Priority를 주면 어떻게 달라지는 지 알아봅시다! Content Hugging Priority (어떻게 채울래?) Content Compresstion Resistance Priority (어떻게 줄일래?) 이거 두개만 생각하면 됨! 상단 뷰에 나온 것대로 설정을 하면 아래와 같음! ( 참고로 뒤에 Label만 건드렸음! ) Content Hugging Priority Content Compresstion Resistance P..
스토리보드와 연결하게 될 때 쓰이는 것들 @IBOutlet 과 @IBAction 1. 공통적으로 들어가는 'IB' Interface Builder 의 약자이며 스토리보드라고 생각하면 편하다 2. @IBOutlet 스토리보드를 연결할 수 있게 해주는 프로퍼티(property)! @ IBOutlet let lbl: UILabel ! 2-1. @IBAction 스토리보드에서 어떤 행위를 처리하는 메소스(method)! @IBAction func btn(_ sender: Any) { print("Jacob") } 3. Control Action type (Touch 관련) - touchDown : 컨트롤을 터치했을 때 - touchDownRepeat : 컨트롤을 연속 터치할 때 - touchDragInside ..
벌써 4월 중순이 흘러가고 있습니다! 6월이면 WWDC 22년 발표도 있고 시간이 너무 빠름! 이번 포스팅은 해보고 싶었던 라이브러리 배포를 해보고자 계획함! 워낙 정리가 잘된 곳이 많아 따라하기만 하면 무난하게 배포?도 가능! 근데 저는 Error가 뜸 ㅎㅎㅎ [iOS] file patterns: The 'source_files' pattern did not match any file. 자꾸 'Source_file'이 뭔지 맞는게 없다고 뜸 ㅜㅜ 그래서 검색 결과 2개로 추려짐 .podspec에서 'Source_file' 만들어지는 건 굳이 건드릴 필요없음! 지금 만든 걸 예시로 들면 'FastPWView/Classes/**/*' 이렇게가 맞고 2개 중 하나는 본인 라이브러리에서 Classes내부에 경..
올해 첫 게시글입니다! 올해에는 좀 더 성장하는 개발자가 되자! 가 목표 지금 SLProject 기간이라서 정신이 없구만요.. 대부분 오류는 Github에 명시했지만 따로 적고 싶은 글이 생겨서 포스팅하고자 함! 개발하면서 장점이자 단점은 내가 적지 않은 부분을 구현해주는 거 인거 같다 장점은 워낙 많겠지만 단점은 이번에 발견함.. 상황 바로 Date -> String String -> Date 로 변환하는 과정에서 있었다 일반적인 경우 한 가지로 변환하면 문제가 없다 근데 내가 마주한 상황은 Date -> String -> Date로 쓰고 싶은 거였다 무슨 말인가 하면 원래 Date로 주는 값을 String으로 변환한 뒤 사용했고 이 값을 저장한 뒤 다시 Date로 넘겨주려고 했다! 정확히 말하면 Da..
프로젝트+팀빌딩+앱 출시를 하다보니 블로그 업로드를 못했다 ㅜㅜ 다시 수업을 진행하면서 과제 오류가 발생하여 포스팅하고자 함 ReusableView를 상속받아서 굳이 static let identifier 를 설정안해줘도 되는 걸 만드는데 아래와 같이 오류가 떴다 '이미 선언이 되어 있는데 왜 선언해?' 이런 느낌임 그래서 선언해주는 View를 다르게 해주면 해결할 수 있음! cell마다 선언해주는 게 아니라 View에 선언해주면 해결할 수 있었다! 잘못된 정보일 경우, 댓글 언제나 환영입니다 ㅜㅜ #네이버_블로그_글_이동!
이번 포스팅은 회사에 정해진 CI/CD가 없어서 제가 한번 도입하고자 테스트 할 겸 공부 겸 포스팅하고자 함!ㅎㅎㅎ 요즘은 코드 이슈보다 보안 이슈나 서비스 이슈가 더 많은 거 같음 일단 CI/CD가 뭐냐?하믄 자동화 프로세스라고 보면 됨! CI를 도입하려고 했는데 Github Action을 쓰고 있는 거 같아 일단 패스~ 그리고 배포까지 자동화하려고 했지만 사수 분께서 testFlight까지만 잡아달라고 해서 이번 포스팅은 TestFlight까지 올리고자 함! 사실 배포나 다른 것도 쉬우니 그럼 바로 넘어가봅시다! 1. Homebrew를 설치해줍니다! (구글링 하면 brew 설치하는 한줄 금방 뜹니다!) 2. Xcode Command line이 설치되어 있는지 확인해준 뒤 brew를 통해 fastLan..
진짜 오랜만에 글쓰는 거 같음 요즘 새로운 걸 자꾸 배워서 정체되어 있는 않은 느낌 핵좋음 이번 에러는 Realm을 관리하는 방법은 여러가지가 있겠지만 그 중에서 fileURL을 찾아서 이동하는데 발생한 에러임! // 아래 코드를 사용해서 fileURL을 찾을 수 있음! print("located at:", localRealm.configuration.fileURL!) 1. 첫번째 가장 많이 하는 실수 ( file :/// ) - 프린트를 하게 된다면 file:/// User/Desktop/Library ~~~~/default.realm 이런 형식으로 나올 텐데 앞에 있는 ' file:///' 를 빼고 폴더이동을 해줘야 잘 이동해짐! 2. 내가 겪은 에러? 오류? Finder 에서 폴더 이동 ( cmd ..
이번 글은 문제라기보다 실수? 같은 걸 적어놓기로 한다 괜히 적어두면 기억도 잘나서 1. LinesOfNumber tableView에서 Dimension 구현하는데 Cell 에 LinesOfNumber 깜빡해서 내가 맞다고 컴퓨터랑 20분 실랑이 하다가 처음부터 코드 읽어보니까 내가 잘못했... 까먹지 말자! 2. TextView UI 과제하다가 TextView에서 수정 불가능하게 해야겠다 생각이 들어서 Attribute Inspector에서 쭉 읽어보다가 Secure!(secure text entry) 있길래 아~ 수정 못하게 막아야지 이렇게 생각했.... 디바이스에 실행시켜보니까 뭐지 했다 바본가 ㅋㅋㅋㅋ... 이거 해제 했어야지 이것도 까먹지 말자! #네이버_블로그_글_이동!
Xcode 사용하다보면 스토리보드에서 Assistant 가 안보여지거나 이상하게 보여질 때가 있다 그럴 때는 가장 좋은 게 껐다가 다시 켰을 때 원래대로 나온다 끄는 게 귀찮을 때는 Assistant를 열고 option키를 눌러서 열면 잘 나오기도 한다 방금 오류 났을 때 캡처를 했어야 했는데 ㅜㅜ 정신없이 수업따라가다 나만 하나 안되면 찐 당황;; 그때부터 멘붕 상황 스토리보드를 그룹으로 묶었는데 이런 상황이 발생했다... 똑바로 열었고, 껐다가 켜봤고 Assistant를 option키로 열어봤는데도 안됐다 화면을 분할하여 아웃렛을 연결 시키려고 했으나 빨간색 글씨 뜨면서 실패... 해결 일단 여기 동그라미에서 ViewController를 해주면 된다ㅋㅋㅋ... 그리고 identifier 나 story..
이번 포스팅은 라이브러리를 만들면서 생긴 에러에 대해서 다루고자 함 라이브러리를 좀 더 예쁘게 만들고 싶다는 생각도 있었지만 그건 나중에 업데이트 하는 걸로! 곧 만든 라이브러리 소개 글이랑 Git Readme 업데이트도 할 예정 ㅎㅎ 에러 디버깅 화면을 캡처했는데 그게 어디간 지 없어짐 ㅜ 아무튼 생각나는 내용은 에러: ASSERTION FAILURE ~~ 무슨 thread 내용이 뜸.. 해결 Case 1. Delete Derived Data Xcode -> performance -> Locations -> Derived Data 폴더 -> Derived Data 삭제 해결 Case 2. Update Pods pods 업데이트를 해주기 (근데 내가 만든 라이브러리라서 그닥..?) 해결 Case 3. D..
오늘 다뤄볼 내용은 UIView에 대한 내용임 예전에 어떤 이슈가 있었냐면 Storyboard로 작업을 할 경우에 View 순서를 마음대로 바꿀 수 있었는데 Code UI를 작성할 경우, View 순서를 어떻게 바꿔줄까 생각이 들었음 뭐 추가하는 순서대로 나오기야 하겠지만 코드 살펴보기 힘들고 그럴 때 유용할 듯! 본론으로 넘어가면! class ViewController: UIViewController { let testView = UIView() let testView2 = UIView() let testView3 = UIView() override func viewDidLoad() { super.viewDidLoad() viewConstraints() testView.backgroundColor = ..
요즘 코로나가 심해져서 어딜가기가 너무 무서운 것 같음 빨리 코로나가 해결됐으면 좋겠음 ㅜㅜ 오늘 다룰 에러는! "The default FirebaseApp instance must be configured before the default Authinstance can be initialized. One way to ensure this is to call 'FirebaseApp.configure()' in the App Delegate's' application(_:didFinishLaunching withOptions:)'(or the '@main' struct's initializer in SwiftUI)." 이번 오류가 길다 길어; 나는 인스턴스 초기화해줬는데 왜 오류가 떴지 했는데 읽어보니 A..
이 포스팅이 발행될 때면 아마 또 하나의 프로젝트도 끝이 날 거 같다! 요번에 다룰 내용은 다른 블로그에 글이 그렇게 많이 있지 않아서 내가 써보려고 하는데 조금 틀리거나 부족한 부분도 있을 수 있으니 주의!!! 가장 먼저 Firebase FCM 문서에 보면 기본 세팅이 있으니 거기까지는 쉽게 할 수 있을 듯! 그 다음으로 문제가 위에 베너를 클릭했을 때 어떻게 해줄거냐하면 AppDelegate / SceneDelegate에서 처리해주면 됨! ( SceneDelegate가 왜 나온진 다음으로 미루고 ) 다음 함수에서 어떤 순서로 들어오는 지 먼저 확인해보자구요 func application(_ application: UIApplication, didRegisterForRemoteNotificationsW..
오늘 알려드릴 간단한 팁은 Navigation Bar에 Item넣기 입니다! 스토리 보드로 넣으려면 엄청 쉽게 가능하지만 코드로 작성해서 넣으려니 잘 안되는 거 같고 그러실 거 같아서 포스팅하게 됨! 이번껀 누구나 다 알고 있는 걸 수도 ㅎㅎ.. 본론으로 바로 넘어가서 사용법 lazy var backButton = UIBarButtonItem(image: UIImage(systemName: "chevron.left"), style: .plain, target: self, action: #selectior(backButtonClicked)) 추가하고 싶은 함수는 아래처럼! @objc func backButtonClicked() { // 여기에 구현! } 쉽죠? 사용은 이렇게 하시면 됩니다 음 더 나아가서 ..
오늘은 간단한 Tip인데 App을 만들다 보면 여러 화면을 왔다갔다 하잖아요 (NavigationController + TabBarController를 사용하고 있을 때 해당됨!) 상황 : (TabBar를 사용중이고) 1~4번 화면이 차례대로 NavigationController에 쌓여있을 때 어떻게 pop해주는가 입니다 view를 이동 시킬 때 present/dismiss push/pop windowScene 이렇게 있는 듯! windowScene로 이동하면 해당 rootView가 제일 위로 올라와서 TabBar 나 NavigationBar나 이상하게 나올 거임 그러면 push된 걸 pop으로 하나씩 계속 해줘야 해? 이러면 그건 또 아님! Tips. 맨 처음 navigation 화면으로 내려가고 싶으..