-
210502 - TILTIL/2021 2021. 5. 3. 01:42
UIWindow
프로젝트에 NavigationViewController를 직접 생성하고 화면을 추가하려는 작업을 하려다 UIWindow까지 오게 됐다.
appDelegate에 추가시켜줄 때나 RootView를 바꿀 때 사용은 했지만 뭔지 정확하게 모르는 거 같아서 이번 기회에 공부했다.
App의 user interface의 backdrop이며 View의 이벤트 처리를 담당하는 객체
ViewController와 함께 이벤트를 다루고 앱 작동의 기본적인 다른 일들을 수행한다.
Window를 두 가지 상황에서만 사용하는데
- App의 content를 나타내는 main window를 제공할 때
- 추가적인 content를 나타내는 additional window를 생성할 때
여기서 생각해볼 additional content라는 것은 새로운 스크린에 기기를 연결했을 때 나타나는 추가적인 화면을 의미한다.
한마디로 이런 연결을 통해 새로운 화면을 구성하는 게 아니라면 window를 새롭게 추가시킬 필요는 없다는 말이다.
기본적으로 Xcode는 main window를 제공한다.
Stotyboard는 appdelegate 객체에서 window property의 존재를 필요로 하는데 새로운 프로젝트를 생성하면 iOS 13.0 이상에서는 SceneDelegate로 가보면 window property가 기본으로 제공되는 것을 확인할 수 있다.
iOS13.0 미만 버전에는 AppDelegate에서 존재해야 하는데 window를 선언하지 않고 버전을 낮추고 iOS 13.0 미만 버전으로 앱을 실행하면 검은 화면만 뜨고 아무것도 안 뜨는 것을 확인할 수 있다. (이래서 AppDelegate에 var window: UIWindow? 를 추가시켜준 거였구나..))
만약 StoryBoard를 사용하지 않으면 반드시 window를 직접 생성해줘야 한다.
UIWindow 객체는 다음 작업에서도 사용된다.
- Window의 z축 level을 설정한다 - 그리고 이건 가시성에 영향을 준다는데... 뭔 말인지 모르겠다..
- Window를 보여주고 keyboard event의 타겟으로 만든다.
- Window's coordinate system으로 좌표값을 변환시킨다.
- Window의 root view controller를 바꾼다.
- Window가 표시하고 있는 screen을 바꾼다.
Window는 어떠한 시각적인 모습도 가지지 않지만 하나이상의 view를 host한다. 그리고 View는 window의 root view controller로 관리된다.
UIScreen
UIWindow를 공부하다 보니 마지막에 있길래 궁금해서 공부하게 됐다...!
하드웨어 기반의 display와 관련된 propertiy들을 정의하는 객체이다.
속성들을 찾아보니 재밌는 속성들이 많이 있었다.
bounds, nativeBounds, currentMode, brightness 그리고 screen connection을 알 수 있는 Notification
기기 화면의 크기를 가져오고 싶으면 bounds 속성을 사용하면 될 거 같다.
그리고 추가적인 설명은 iOS 디바이스는 하나의 main screen과 없거나 여러 개의 attached screen을 가진다.
위 속성들을 사용하려면 UIScreen.main 을 통해 기본적으로 제공되는 main Screen에 접근해서 사용하면 될 거 같다.
그리고 iOS 8.0 이후부터 bounds 속성은 스크린의 interface orientation에 따라 달라진다.
즉 세로 화면 Portrait와 가로화면 LandScape일 때 속성 값이 다르다는 의미이다.
지금은 필요하지 않아서 쓱 읽어만 본 Handling Screen Connection and Disconnection Notifications은 나중에 쓸 일이 있다면 읽어보자!
CoreData: annotation: Failed to load optimized model at path 오류
iOS 최신버전에서는 아무 문제가 없었는데 11.0 버전 시뮬레이터로 실행하니까 위와 같은 오류가 나왔다.
원인은 정확하게 모르겠지만 coredatamodel 버전을 추가하고 나서 생긴 거 같기도 하고.. 이름에 오타가 있어서 이 부분은 버전 추가하지 않고 바꿨는데 그 부분에서 오류가 있던 거 같기도 하고 그렇다.. 아무튼 여기서 .mom .omo 가 나오길래 뭔가 하고 찾아봤더니
.mom은 Managed Object Model file의 약자이고
.omo file은 .mom file의 최적화 버전이라고 한다.
.mom은 binary plist file이고 .omo는 로드가 더 빠른 다른 format file 이란다..
아무튼 이 문제의 해결 방법은 container를 생성할때 버전별로 다르게 생성을 해주는 방법이었는데
코드를 하나하나 살펴봤는데 아직 왜 이렇게 해야 하는 건지 이해가 되지는 않았다..ㅠㅠ
stackoverflow.com/questions/12136253/whats-core-datas-omo-file-is-it-required/24129462#24129462
Derived Data 삭제
이제야 안 사실이지만 Info.plist file에 Target은 원래 지정이 안돼 있다.
오히려 직접적으로 target을 지정하면 에러가 발생한다.
이걸 몰라서 처음엔 Cleanbuild도 해보고 Derived Data를 삭제해야겠다 해서 삭제하려 했는데 오랜만이라 어디서 지워야하는기 기억이 안 나서 적어본다.
Preference -> Location -> Dericed Data -> 로 접근해도 되고
Xcode 파일에 DerivedData로 접근해도 된다.
FileManager를 이용하여 cacheDirectory에 이미지를 저장하고 사용하기
오늘 제일 중점적으로 공부한 부분인데.
Blob에 image를 저장해놓고 이 이미지를 FileManager를 이용해서 cache dir에 저장한 다음 이 URL로 이미지를 사용하는 방법이다.
두 가지 중요한 부분은 일단 Filemanager를 통해 cacheDirectory의 url을 가져오는 부분과
사용자가 직접 추가한 file이 아니기 때문에 backup에서 제외시켜야 하는 부분이다.
내일 한번 더 복습을 해보고 자세한건 내일 적어야겠다.
728x90'TIL > 2021' 카테고리의 다른 글
210507 - TIL (0) 2021.05.08 210505 - TIL (0) 2021.05.06 210430 - TIL (0) 2021.05.01 210429 - TIL (0) 2021.04.30 210427 - TIL (0) 2021.04.28