이번엔 Info셀에 실제 데이터를 가져와서 적용시킨다. 데이터 연결 먼저 설정해 놨던 더미 Text, image 들을 지우자. 그리고 viewModel의 데이터를 이용하여 초기화한다. final class RMCharacterInfoCollectionViewCell: UICollectionViewCell { ... public func configure(with viewModel: RMCharacterInfoCollectionViewCellViewModel) { valueLabel.text = viewModel.value titleLabel.text = viewModel.title } } 개선 개선할 점이 네 가지가 보인다. 이미지가 필요 문자열이 잘리고 날짜가 이상하게 보인다. 마지막으로 비어있는 Ty..
Info Cell을 만들어 본다. 간단하게 View를 정의할 것이다. VM을 조정하여 더욱 Type safe 하게 만들 것이다. UI 잡는건 너무 기본적인 거라서 이번에는 설명을 생략하겠다. system 색상만으로 코딩을 진행하는 게 인상 깊었는데 이렇게 두고 보니 꽤 깔끔한 화면이 나온다. contentView.layer.masksToBounds에 대해 잠깐 설명하면 뷰의 경계를 기준으로 서브 뷰와 레이어의 영역을 잘라내는지의 여부를 결정하게 된다. 우리는 이걸 true로 하는데 경계를 넘어가는 서브 뷰를 삭제해 버린다. 보통 circle Image View 같은 걸 만들 때 자주 사용할 것이다. final class RMCharacterInfoCollectionViewCell: UICollection..
두 메서드 모두 UIView를 초기화하다 보면 사용하는 녀석들이다. init(frame:) frame은 코드를 사용하여 뷰를 생성할 떄 호출하는 초기화 메서드다. (코드 베이스, programmatically 등) super.init(frame: ) 사용자 지정 뷰 클래스에서 UIVIew에 있는 init(frame: ) 메서드를 호출함으로써 초기화를 돕는다. 대표적으로 뷰의 프레임을 설정하거나 기본 속성을 설정한다. super.init(frame:. zero) frame 값을. zero로 주는 경우가 많은데 초기에 뷰가 화면에 나타나는 걸 방지하기 위해 한다. init(coder:) Storyboard, xib을 이용하여 화면을 구성할 때 필요한 녀석이다. NScoder를 이용하여 처리하게 되며, 컴파일..
Type of expression is ambiguous without more contextType of expression is ambiguous without more context 이 에러는 wrong argument 문제이다. 때문에 메서드를 이용하는 부분에서 문제가 생길 여지가 많다. 문제상황 내 경우에는 이 에러는 swicth에서 result를 이용해 success case, failure case를 두고 상황별로 동작을 정의하던 중에 발생했다. success에서는 let data를 생성하여 행동을 정의했고 failure에서는 let error를 만들고 그냥 break로 임시로 처리를 해놨다. public func configure(with viewModel: XYZViewModel) { v..
세 종류의 Cell에 어떤 내용이 들어가는지 생각하고 구현해 보자 Cell VMs photo 셀은 imageURL이 필요하다. final class RMCharacterPhotoCollectionViewCellViewModel { private let imageUrl: URL? init (imageURL: URL?) { self.imageUrl = imageURL } } Info 셀은 안에서는 Status: XXX와 같은 구조를 구현할거기 때문에 value와 title이 필요하다. final class RMCharacterInfoCollectionViewCellViewModel { public let value: String public let title: String init ( value: Strin..
이번엔 VM - View - VC를 연결하는 작업을 한다. Cell의 View와 VM 생성 먼저 Views 그룹에 또다시 CharacterDetails라는 그룹을 만들어 관리하자. 여기서 RMCharacterCollectionViewCell이라는 이름으로 세 가지 셀 파일을 만들어주고 각각 대응되는 VM도 만들어서 그룹으로 묶어준다. 이제 DetailVM에서 SectionType enum으로 가서 Associated value라는것을 추가할 것이다. enum SectionType { case photo(viewModel: RMCharacterPhotoCollectionViewCellViewModel) case information(viewModels: [RMCharacterInfoCollectionVie..
이번에는 우리가 만들 세 개의 섹션에 대한 레이아웃을 잡는다. 나중에는 VM을 이용하여 데이터를 주입할 것이지만 지금은 그렇게 하지 않고 더미로 표시할 것이다. 첫 번째 섹션은 이미지만을 출력할 거라 1개, 두 번째는 Character가 가진 요소인 8개, 세 번째는 캐릭터마다 다른 숫자를 가진다. 임시로 20개라고 하자. extension RMCharacterDetailViewController: UICollectionViewDelegate, UICollectionViewDataSource { ... func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { switch secti..
이번엔 Compositional Layout을 이용하여 dummy 화면을 구성할 것이다. 지난번에 Cannot find type 'NSCollecitonLayoutSection' in scope 에러가 있는 상태에서 끝났었다. Layout 일단 section을 선언해 주고 group을 받자. 다시 group을 위에서 선언한다. 일반적인 Group을 만들 때와는 달리 지금은 vertical을 만들 것이다. 서브아이템으로 [item]을 받게 하고 사이즈는 일단 비워두자 private func createSection(for sectionIndex: Int) -> NSCollecitonLayoutSection { let group = NSCollectionLayoutGroup.vertical( layoutSi..
원인 새롭게 push 되는 ViewController의 배경색이 정해져 있지 않기 때문이다. 해결 ViewController에 배경색을 지정해 주면 된다. 예전에 몇번 겪었던 거 같은데 오랜만에 경험한다. 이전에는 View를 대충 그리고 데이터를 연동하는 방식으로 방식으로 했기 때문에 그랬던 거 같다.
self 보통 인스턴스 메서드 안에서 현재 객체를 가르키고 싶을 때 사용한다. 프로퍼티, 메서드를 대상으로 한다. Self 단순 객체가 아니라 Type(class, struct etc)을 가르키는 키워드이다. 만약 static 메서드를 사용한다면 이건 타입 자체에 속하기 때문에 self를 사용할 수 없다. 부끄럽게도 이제야 이걸 알게 되었다. 몰랐던 원인은 Xcode가 알려줄때 Self를 사용해야 하는 시점에 해당 타입을 추천해줘서 직접 모든 타입명을 다 입력해서 사용했기 때문이다. 반성