트러블슈팅 - 해리포터 시리즈 앱

Evan·2025년 4월 4일

프로젝트 진행 중 겪었던 트러블 슈팅


1. BookHeaderView 버튼 원형으로 변경되지 않는 문제


문제상황

버튼이 추가되면 뷰가 변경되어 layoutSubviews가 호출될 것으로 기대했으나, 실제로는 버튼의 frame이 최종적으로 확정되지 않은 상태에서 cornerRadius가 계산되어 원형이 적용되지 않는 경우가 발생하였다.

코드 예시

override func layoutSubviews() {
    super.layoutSubviews()
    seriesButtons.forEach { button in
        button.layer.cornerRadius = button.bounds.width / 2
        button.clipsToBounds = true
    }
}

해결방법

layoutSubviews 내부에서 seriesButtonStackView.layoutIfNeeded를 호출해 스택뷰와 그 하위 버튼들의 레이아웃이 최종적으로 업데이트된 후 cornerRadius를 계산하도록 한다.

코드 예시

override func layoutSubviews() {
    super.layoutSubviews()
    seriesButtonStackView.layoutIfNeeded() 
    
    seriesButtons.forEach { button in
        button.layer.cornerRadius = button.bounds.width / 2
        button.clipsToBounds = true
    }
}

요약:

  • layoutSubviews에서 layoutIfNeeded를 호출하면, 버튼의 frame이 확정된 상태에서 cornerRadius를 설정할 수 있어 항상 원형이 적용된다.



2. viewDidLoad에서 Alert 창이 띄워지지 않는 문제


문제 상황

viewDidLoad 내부에서 데이터를 로드하는 과정 중 Alert를 동기적으로 호출하면, 뷰가 완전히 로드되기 전에 Alert가 표시할려고 하여 제대로 보이지 않는 문제가 발생하였다.

코드 예시

override func viewDidLoad() {
    super.viewDidLoad()
    loadBooks()
    configureDelegate()
}

private func loadBooks() {
    dataService.loadBooks { [weak self] result in
        guard let self = self else { return }
        
        switch result {
        case .success(let books):
            self.books = books
            self.configureUI()
            
        case .failure(let error):
            var errorMessage = ""
            
            if let dataError = error as? DataService.DataError {
                switch dataError {
                case .fileNotFound:
                    errorMessage = "Json 파일을 찾을 수 없다."
                case .parsingFailed:
                    errorMessage = "데이터 변환에 실패하였다."
                }
            }
            
            self.showAlert(message: errorMessage) // 동기적으로 호출되어 Alert 미표시 문제 발생
        }
    }
}

해결 방법

Alert를 띄우는 부분을 DispatchQueue.main.async 내에서 호출해, viewDidLoad가 완전히 종료된 이후에 Alert가 표시되도록 수정한다.

정상적으로 동작하는 코드 예시:

DispatchQueue.main.async {
    self.showAlert(message: errorMessage)
}
profile
iOS 개발자

0개의 댓글