Application Specific Information: CoreFoundation: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIButton lbText]: unrecognized selector sent to instance 0x1052ce370' 이 오류가 왜 나는지는 알고 있었다.보통 swift 프로젝트에서 ObjC 라이브러리를 사용하게 되었을 때, other linker flag에 `-ObjC`를 추가 안 해 주면 해당 ObjC 파일을 스위프트 컴파일러가 찾지 못해 해당 오류가 발생하는 경우가 잦다. 하지만? 이번에는 그런 경우는 아니었따 . . ..
요즘에는 SwiftTest라고 SwiftUI에서 하는 테스트가 따로 있던데 우리 회사는 UIKit을 기반으로 Objc / Swift를 혼합하여 사용하고 있어 XCTest를 사용해야 했다.WWDC 즈음부터 공부하던 거라 ㄱ- 알고 보니 SwiftTest는 2024WWDC에서 새로 나온 거더라?! 전혀 몰라따 .... :3 XCTest의 처음과 끝먼저, 기본적인 순서는 다음과 같다.setUp(): 앱 실행test_something(): 기능 테스트tearDown(): 종료첨에 이런 순서를 알고 테스트를 했는데 갑자기? 막 오류가 나고? 이상하게 테스트가 진행되는 것이다.그러니까, 나는 … … setUp() → test_1() → test_2() → … → tearDown() 이런 순인 줄 알았는데 아니었다..
Privacy Manifest 때는 바야흐로 24년 2월 29일. Apple Development News가 올라왔다. 바로 Privacy Manifest에 관한 것이었는데, 처음 봤을 때는 이… … 이게 뭐지? 싶었다. 그랬다. 내가 보지 않은 2023 WWDC 영상 중 하나가 Privacy Manifest 관련이었던 것이다…. Get started with privacy manifests - WWDC23 - Videos - Apple Developer Get started with privacy manifests - WWDC23 - Videos - Apple Developer Meet privacy manifests: a new tool that helps you accurately identify ..
iOS에서 앱을 실행하면? UIKit은 Objective-C 기반으로 되어 있기 때문에 내부에서 main 함수를 기반으로 돌아간다. 이 main 함수가 돌아가면서 `UIApplication`이 실행되고, 이 `UIApplication`은 singleton 형태로 생성되어 앱 전역에서 사용할 수 있다. 이후, 아래 사진의 Main Run Loop가 실행된다. 이 Main Run Loop가 돌아가면서 View에서 사람들의 event를 받고 update한다. 당연히! main Run Loop는 UI 관련 동작을 하기 때문에 Main Thread에서 동작한당. 앱의 생명 주기를 관리하기 개요 앱의 현재 상태란 앱이 언제든지 수행할 수 있는 작업과 수행할 수 없는 작업을 결정한다. 예를 들어, 포그라운드 앱은 사..
기존의 방법으로 Widget에 Background를 적용하려고 하면, 제대로 적용되지 않고 이상한 padding이 적용되어 있다. 이런 식으로! 너무 이상해 보여서 여러 방법을 찾아보다가 괜찮은 글을 발견해서~~! 블로그에도 기록해놓으려고 한다. 찾아보니 Xcode15 / iOS 17부터는 Widget에 contentMargin이 기본으로 적용되어 있어 이를 해제해 주는 것이 필요하다. 그 방법으로는. .. . struct CoinWidgets: Widget { let kind: String = "CoinWidgets" // 위젯의 고유한 문자열 var body: some WidgetConfiguration { AppIntentConfiguration(kind: kind, intent: Configura..
Share 기능 구현하기 전체적인 로직은 다음과 같다. 간단하다! 초반 구현 func share(activeVC: UIActivityViewController) { activeVC.popoverPresentationController?.sourceView = self.view self.present(activeVC, animated: true) } 요런 식으로 작성했다. 다만, 내가 원하는 거랑 많이 달랐다 ,, ,, ㅠ,ㅠ 짱나. 왜 내가 원하는 것과 다르게 나오는 걸까? 정답은 ActivityViewController를 구성하는 방법에 있다. 처음 코드에서는 String 배열로 ActivityuViewController에 들어가는 내용을 구성해 주었기 때문에 원하는 형식으로 들어가지 않는 것이다! 고..
UI Test와 Unit Test UI Test 화면에 보이는 객체가 잘 눌리는지, 화면 전환은 잘 되는지 확인할 수 있다. 또한, 접근성 관련 설정이 잘 동작하는지 테스트할 수 있다. Unit Test 비즈니스 모델에 문제가 없는지, 로직에 대한 테스트를 하는 것! 이 안에서 UI적인 이름을 많이 가지고 있을 경우에는 추후 UI 객체를 수정하게 될 때, 테스트 코드까지 수정해야 할 수 있다. 따라서, 로직만 테스트 할 수 있는 형태로 구성하는 것이 좋다! CLEAN CODE에서 나온 원칙으로, FIRST 원칙이 있는데... ... Fast: 빨리 테스트를 할 수 있게끔 만들어야 한다. Independent: 각각의 테스트가 독립적이어야 한다. (서로 영향을 받으면 안 됨) Repeat: 반복적으로 같은..
이전 프로젝트의 UI를 손보고 있는데,, 라이트모드를 기본으로 했던 거에서 다크모드로 옮기려고 하니까 진짜 온갖 걸 다 변경해야 하드라 사실 당연함 ,, 워낙 예전에 만들었던 프로젝트다 보니까 모든 설정을 잘게 나누어서 각각 해줬더라 그때랑,, 지금 별 차이 없는 거 아닌가? 하는 생각을 간혹 했는데 전혀 아니었다 암튼 ㄱㄱ링 문제 화면이다. self.navigationController?.navigationBar.backgroundColor = .black 왼쪽에서 오른쪽은 위 코드를 적용할 경우에 저런 식으로 나온다. 대체 노치는 왜 안 채워주는 거냐?! 해결 방법 스크롤뷰가 있을 때 let navigationBarAppearance = UINavigationBarAppearance() navigat..