Skip to content

Conversation

@AKAPUCH
Copy link
Contributor

@AKAPUCH AKAPUCH commented Jun 19, 2023

새로 학습하거나 시도해본 부분

앱 번들과 Codable 객체를 활용한 json 데이터 로드

  • 스터디 주제였던 App bundle에 대해 조사하면서 시스템 파일 경로를 통해 json 파일 로드하는 방법을 사용해 보았습니다.
  • 현재 앱의 코드 디렉토리로 접근할 수 있는 Bundle.main 객체를 사용했습니다.(코드는 김종권님 블로그 참조)
if let bundlePath = Bundle.main.path(forResource: "artists", ofType: "json"), 
let jsonData = try String(contentsOfFile: bundlePath).data(using: .utf8) {
    artGallery = try JSONDecoder().decode(Gallery.self, from: jsonData)
}
  • 레퍼런스는 JSONSerialization을 통해 딕셔너리 형태로 데이터를 디코딩하였으나, Swift4 이후에 쉽게 변환할 수 있는 Codable 프로토콜을 사용하여 구현했습니다.
  • 작가 작품 리스트 화면에서 셀 선택에 따라 속성을 변경해야 했기 때문에 Artists, Work 모델은 클래스로 구현했고 선택여부 판별을 위한 추가된 isSelected 프로퍼티를 위해 생성자를 직접 수정했습니다.
import Foundation

class Works: Codable {

	var title : String?
	var image : String?
	var info  : String?
	var isSelected : Bool = false
    
	required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.title = try container.decodeIfPresent(String.self, forKey: .title)
        self.image = try container.decodeIfPresent(String.self, forKey: .image)
        self.info = try container.decodeIfPresent(String.self, forKey: .info)
    }
}

xib 파일을 통해 테이블 셀 구현

  • 성경님의 project3-페이스북프로필PR을 보면서 사용하는 셀 별로 xib파일로 분리하여 관리하는 것이 간결하고 유지보수에 좋다고 느껴 시도해 봤습니다.
  • Main.storyboard 파일에 프로토타입 셀을 배치하지 못해 segue를 활용하지 못하는 점은 조금 아쉬웠습니다.

데이터 유효성 검증

  • 프로젝트 4 PR 리뷰를 하면서 데이터에 대한 유효성 검증 로직이 부족하다 라고 코멘트를 달아드렸는데, 제 결과물도 유효성 검증이 부족했던 것 같아 이번에는 조금 더 꼼꼼하게 데이터 검증로직을 적용했습니다.
  • 실패 시 추적이 용이하도록 fatalError를 통해 로그를 남기게 구현하였습니다.

사용자가 시스템 텍스트 크기 변경시 바로 반영

  • 레퍼런스 코드를 처음 봤을 때, 작품 설명 텍스트가 변경되었을 때 변화를 반영하기 위함인가? 했으나..
  • ios의 설정 - 손쉬운 사용 - 디스플레이 및 텍스트 크기 - 더 큰 텍스트 메뉴를 통해 사용자가 글자 크기를 변경 시 그 변화에 따른 테이블의 레이아웃 변화를 업데이트 하기 위함이었습니다.
  • UIContentSizeCategory.didChangeNotification(텍스트 크기 변경시 시스템에서 post)의 옵저버를 추가하여
    알림이 발생한 순간 테이블이 새로고침 되도록 구현하였습니다.
NotificationCenter.default.addObserver(forName: UIContentSizeCategory.didChangeNotification, object: .none, queue: OperationQueue.main) { [weak self] _ in
            guard let self = self else {return}
            self.artWorkListTableView.reloadData()
}

테이블 뷰 배치 업데이트(변경사항 반영하기)

  • 테이블 뷰에 변경사항이 발생했을 때는 reloadData()메서드를 통해 반영되도록 하곤 했는데,
    사실상 테이블을 통째로 지우고 만드는 일이기 때문에 비용이 큰 작업이었습니다.
  • beginUpdates()와 endUpdates(), animate 메서드를 통해 작품 정보 펼치기/접기 토글 시 자연스럽게 UI가 변하도록 만들 수 있었습니다.
// MARK: - 설명의 길이에 따른 레이아웃 변화를 테이블에 반영합니다.
UIView.animate(withDuration: 1.0) {
    tableView.beginUpdates()
    cell.workInfoLabel.text = currentArtWork.isSelected ? 
    currentArtWork.info : "Select For More Info >"
    
    cell.workInfoLabel.textAlignment = currentArtWork.isSelected ?
     .natural : .center
     
    tableView.endUpdates()
}

하면서 아쉬웠던 부분

스토리보드로 네비게이션 바 attribute 설정

  • ios 13 이후부터는 UINavigationBarAppearance 객체를 통해 네비게이션 바의 속성을 설정해야 합니다.
  • 코드로 구현 시 UINavigationBarAppearance 인스턴스 하나를 생성하고 navigationbar의 appearance property(standard, compact, scroll edge, compact scroll edge)에 각각 할당하면 되기 때문에 간단했습니다.
  • 스토리보드로 설정해보니 각 appearance 메뉴마다 일일이 속성을 설정해줘야 했고 매우 번거로웠습니다.. 다른 방법은 특별히 없는 것 같았고 다음부터는 구현 유형에 따라 유연하게 선택해야 할 것 같습니다😭

@AKAPUCH AKAPUCH requested a review from OpenBible3438 June 19, 2023 15:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant