각 구현에서 UI의 일부를 사용자 정의 할 수있는 응용 프로그램 프레임 워크를위한 설계


9

각 구현이 사용자 인터페이스의 일부를 사용자 정의 할 수 있도록 응용 프로그램 프레임 워크를 설계해야합니다. 이러한 예 중 하나는 구현 (지금부터 클라이언트라고 함)이 특정 화면에 대해 리턴 할 콜렉션보기 셀을 정의 할 수 있다는 것입니다. 이 프레임 워크는 유사한 객체를 만드는 데 도움이되므로 앱을보다 쉽게 ​​구축 할 수 있도록 적절한 객체를 자동으로 판매합니다.

현재 프레임 워크에 대한 접근 방식은 앱 전체의 모든 프레젠테이션 및 해고 이벤트를 담당하는 조정 컨트롤러를 설계하는 것입니다. 기본 조정 컨트롤러는 반드시 구성된 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

인터페이스의 가장 복잡한 부분은 컬렉션 뷰 셀 안에 중첩 된 컬렉션 뷰를 처리합니다. 이를 통해 셀의 가로 페이징 및 세로 스크롤이 가능합니다. 이는 수평 셀을 관리하고 각 셀의 콜렉션보기를 새 데이터 소스로 구성하는 하나의 데이터 소스를 보유함으로써 달성됩니다.

이 모든 셀을 커스터마이징 할 수있는 인터페이스를 어떻게 설계할까요?


접근법 1은 최대한의 유연성을 제공하고, 접근법 2는 최소이지만 사용자의 노력이 가장 적습니다. 무엇을 원하세요?
Trilarion

@Trilarion 솔직히 수석 경험을 기대하고 있습니다. 나의 가장 큰 관심사는 커스터마이제이션에 대해 얼마나 많은 컨트롤을 제공해야하는지 정확하게 예측할 수 없다는 것입니다.
Daniel G

4
사용자 정의를 예측할 수 없습니다. 범용 프레임 워크를 정의하는 것은 어렵습니다. 기껏해야 다른 개발자를 제한하지 않는 공통 코드를 제공 할 수 있습니다. 상속이 필요한 솔루션을 피하고 다른 방법으로 확장 할 수있는 구성 요소에 중점을 둡니다. 자신의 기여를 가능한 한 단순하게 유지하십시오.
Frank Hileman

답변:


1

이것은 오래되었지만 가치있는 질문으로, 내 경험으로는

How would one design an interface that allows all these cells to be customizable?

하지 마십시오.

고객이 UI에서든 다른 어떤 방식 으로든 커스터마이징에서 선택할 수있는 선택을 제한하는 것은 솔루션을 단순화하고 지원 부담을 줄이고 고객에게도 도움이되기 때문에 벤더에게는 거의 항상 더 좋습니다. 공급 업체의 전문 지식을 활용하여 휠을 재발 명하는 데 시간을 허비하지 않고 솔루션 공간의 정점에 도달하십시오.

다른 솔루션이 필요하면 알려줄 것입니다. 만약 그들이 커스터마이제이션을 고집한다면, 다른 솔루션이 필요하지만 아직 모릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.