각 구현이 사용자 인터페이스의 일부를 사용자 정의 할 수 있도록 응용 프로그램 프레임 워크를 설계해야합니다. 이러한 예 중 하나는 구현 (지금부터 클라이언트라고 함)이 특정 화면에 대해 리턴 할 콜렉션보기 셀을 정의 할 수 있다는 것입니다. 이 프레임 워크는 유사한 객체를 만드는 데 도움이되므로 앱을보다 쉽게 구축 할 수 있도록 적절한 객체를 자동으로 판매합니다.
현재 프레임 워크에 대한 접근 방식은 앱 전체의 모든 프레젠테이션 및 해고 이벤트를 담당하는 조정 컨트롤러를 설계하는 것입니다. 기본 조정 컨트롤러는 반드시 구성된 UI를 제공하지 않고도 관련 작업을 수행하는 모든 기본 뷰 컨트롤러를 프레임 워크 내에서 제공합니다. 예를 들어, 하나의 컨트롤러는 템플릿 셀이 포함 된 컬렉션 뷰를 보여 주지만 특별한 것은 없습니다. 이 설계의 이점은 컨트롤러 간의 커플 링을 제거하고 클라이언트가 기본 코디네이터를 재정의하고 특정 작업에 대해 완전히 새로운 뷰 컨트롤러를 반환 할 수 있다는 것입니다.
내가 겪고있는 문제는 클라이언트가 자신의 사용자 정의 UI를 앱에 추가 할 수 있도록이 프레임 워크를 어떻게 디자인 해야하는지입니다.
접근법 하나
프레임 워크에 뷰 팩토리가 필요하게하고이 뷰 팩토리가 모든 관련 뷰를 자동으로 책임 져야합니다. 따라서 App Delegate에서 클라이언트가 예를 들어 CollectionViewCellFactory를 작성하고 인터페이스가 적합한 클래스가 제공해야하는 모든 셀을 정의하도록 강제 할 수 있습니다. 나는이 디자인으로 코드베이스를 물려 받았으며 너무 추상적이면서 커스터마이징이 가능 해졌다. 앱의 모든 측면에 대해 수많은 팩토리가 제공되었으며 이로 인해 모든 앱의 설정 시간이 단축되었습니다.
접근법 2
각 뷰 컨트롤러는 이러한 사용자 정의 UI 클래스를 런타임에 정의 할 수있는 서브 클래 싱 후크 또는 설정 API를 지정합니다 (UISplitViewController에서 호출자가 viewControllers 속성을 사용하여 컨트롤러를 설정하는 방법과 유사). 이를 위해 각 클라이언트는 단순히 기본 조정 컨트롤러와 각 컨트롤러 프레젠테이션에서 서브 클래스를 만들 것입니다. 원하는 UI를 얻을 수 있도록 컨트롤러에 적절한 값을 설정하십시오. 같은 것
viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){
//perform custom registration
}
viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){
//dequeue custom cells
}
현재 뷰의 데이터 소스를 별도의 객체로 분리하여 재사용 성을 높이고 ViewController 팽창을 방지합니다. 이것은 뷰 컨트롤러를 서브 클래 싱하여 셀의 인터페이스를 조금 어렵지만 불가능하게 제공합니다.
접근법 3
프레임 워크를 디자인하고 사용을 예상하는 것은 좋지 않은 생각 일 것입니다. 설치 비용이 상대적으로 높더라도 최상의 제어를 통해 서브 클래 싱을 허용하는 것이 가장 좋습니다. 그런 다음 여러 클라이언트를 위해 빌드 한 후에는 패턴이 나타나고 경로를 따라 최적화를 시작할 수 있습니다.
나는 프레임 워크 내부에서 사용자 정의 할 수있는 방법을 이해하고 있으며, 어려움을 겪고있는 것은 클라이언트가 프레임 워크의 잠재적 인 사용자 정의 지점을 정의하는 인터페이스를 가장 잘 정의하는 방법입니다.
TL; DR
인터페이스의 가장 복잡한 부분은 컬렉션 뷰 셀 안에 중첩 된 컬렉션 뷰를 처리합니다. 이를 통해 셀의 가로 페이징 및 세로 스크롤이 가능합니다. 이는 수평 셀을 관리하고 각 셀의 콜렉션보기를 새 데이터 소스로 구성하는 하나의 데이터 소스를 보유함으로써 달성됩니다.
이 모든 셀을 커스터마이징 할 수있는 인터페이스를 어떻게 설계할까요?