본문 바로가기

iOS/UIKit

(9)
🧊 [iOS] ImageViewer.swift 라이브러리 앱 프리징 이슈 해결 이미지 뷰어 라이브러리를 사용하던 중 특정 상황에서 앱이 완전히 멈춰버리는 문제가 발생했습니다. 문제의 원인을 추적하고 해결한 과정을 공유합니다.이 문제는 ImageViewer.swift의 내부 동작 원리를 정확히 이해해야 해결할 수 있었습니다.🚨 문제 상황재현 시나리오피드 앱에서 다음과 같은 상황이 발생했습니다:사용자 A가 이미지가 포함된 피드를 게시사용자 B가 해당 피드를 확인 중사용자 A가 피드를 삭제 (이미지도 함께 삭제됨)사용자 B가 이미지를 클릭하여 전체화면으로 보려고 시도앱이 완전히 멈춤 (Freezing 발생)작동 영상정상작동 피드 삭제 문제 상황기본 구현ImageViewer.swift 라이브러리를 사용하여 이미지 캐러셀 뷰를 구현했습니다:cell.imageView.setupImageV..
RxSwift + TableView + MVVM + Input & Output 에서 TableViewCell 내부 disposeBag 중첩현상 📗 문제RxSwift를 공부하던 도중CustomTableViewCell을 가진 TableView를 그려보던 도중 이상한 에러가 발생한다 체크버튼을 탭 할 경우 완료 / 미완료 가 되어야하는데갑자기 두 개의 셀이 완료가 되고세 개의 셀이 미완료가 되는 것을 볼 수 있다 탭 했을 때 indexPath를 print 해보니세 개의 셀 내부 버튼을 탭했는데print는 총 6개가 찍힌 것을 볼 수 있다 그렇다,Cell 내부에 존재하는 DisposeBag 인스턴스가 재사용될 때마다중첩이 된 것이다. 그렇다면 재사용되는 타이밍에 disposeBag에 인스턴스를 새로 재할당해주면 해결이 될 것이다. 다시 빌드해봤다왜지...? 분명 disposeBag을 새로 재할당 해줬는데이상하다 싶어 print 함수를 출력해봤다. 나..
UIKit - GCD + Alert 에러 (Call must be made on main thread, Unsupported enumeration of UIWindowScene windows on non-main thread.) 📗 Call must be made on main thread 에러현재 작성된 코드guard (200.. URLSession의 dataTask 메서드를 통해 받아온 response 값의 status code 를 확인하여 에러를 가지고 있는 status code를 만나면 Alert를 뷰에 띄어준다.처음에는 기본적인 present 메서드를 호출하였고present(viewControllerToPresent: UIViewController, animated: Bool) 이 상태로 앱을 빌드한 결과아래 스크린샷으로 보여지는 에러를 만나게 됐다. 그래서 global thread에서 돌렸던 상황에서 아래 코드를 통해 main thread로 다시 thread를 main thread로 돌려놓았고 다시 빌드해 본 결과D..
UIKit에서 UICollectionView에 SkeletonView 간단하게 사용해보기 GitHub - Juanpe/SkeletonView: ☠️ An elegant way to show users that something is happening and also prepare them to which con☠️ An elegant way to show users that something is happening and also prepare them to which contents they are awaiting - Juanpe/SkeletonViewgithub.com위 링크를 통해 Xcode SPM에 라이브러리 패키지 추가 사용할 뷰컨트롤러에 SkeletonView를 importimport SkeletonView collectionView에서 사용되는 cell의 View들(compone..
UIKit - resignFirstResponder() & becomeFirstResponder() 📘 UITextField의 키보드 내리기키보드를 내려야 하는 경우아예 View 자체 혹은 UITextField 혹은 SearchBar에나 편집끝났으니까 키보드 그냥 내려줘 라고 메서드를 통해강제로 키보드를 내릴 수도 있다.해당 메서드는 아래와 같고,view.endEditing(_ force: Bool)textField.endEditing(_ force: Bool) 호출을 하게될 경우 코드는 아래와 같다.view.endEditing(true)textField.endEditing(true) 아니면, Storyboard를 통해 didEndEditing IBAction을 연결해주면 해결이 될 것이다. 📕 resignFirstResponder() & becomeFirstResponder() 하지만 나의 경우..
UIKit - IBOutlet, IBAction 연결관계 에러 해결 방법 IBOutlet의 변수명을 변경하면서 에러가 발생  1. 뷰 객체 연결에 에러가 있을 경우 에러 메시지 확인2. 인스펙터 영역 확인에러가 예상되는 ViewController를 선택 후 커넥션 인스펙터 영역을 확인노란색 경고가 발생한 warning의 x 버튼을 눌러 잘못된 연결관계를 끊어줌 3. 객체 재연결인스펙터 영역에서 연결하고 싶은 아웃렛을 선택하여 스토리보드 뷰 객체 영역과 재 연결📚 Rename을 통해 객체 재연결 없이 변수명 바꾸기
UIKit - Default Button 이상현상 해결법 버튼을 Default 스타일로 사용하다보면 이러한 현상이 발견되는데이미지 에셋에 가보면 해당 이미지의 Render As가 Default Image일 가능성이 높음그렇다면 해당 이미지의 Render As를 Default Image에서 Original Image로 변경   잘 해결된 것을 확인할 수 있다. 코드로도 변경이 가능let playImage = UIImage(named: "play")?.withRenderingMode(.alwaysOriginal)self.playButton.setImage(UIImage(named: "play"), for: .normal)
UIKit & Interface Builder 툴바 영역Run, Stop Button, Scheme, Run DestinationRun Button을 누르면 Run Destination으로 설정한 시뮬레이터 혹은 디바이스로 앱이 빌드됩니다.Activity Indicator빌드 중, 정지 등의 상태를 보여주며, 프로젝트에 문제가 있을 경우 경고 혹은 에러 등의 문구를 보여줍니다.Object Library ButtonInterface Builder(Storyboard) 에서 UILabel, UIButton 등으로 Scene을 구성할 때 사용하는 버튼입니다.Workspace Configuration Buttons창을 넓게 사용하는 용도로 주로 사용합니다.네비게이터 영역주로 프로젝트 네비게이터 영역을 사용하며, 프로젝트가 가지고 있는 파일 목록을 보여주는 ..