web-dev-qa-db-ja.com

各実装でUIの一部をカスタマイズできるアプリケーションフレームワークの設計

私は、各実装がユーザーインターフェイスの一部をカスタマイズできるようにするアプリケーションフレームワークの設計を任されています。そのような例の1つは、実装(これをクライアントと呼ぶことにしましょう)が、特定の画面に返すコレクションビューセルを定義できることです。フレームワークは、適切なオブジェクトを販売してアプリを簡単に構築できるようにするだけです。これは、いくつかの類似したインスタンスを構築するためです。

フレームワークへの私の現在のアプローチは、アプリ全体のすべてのプレゼンテーションおよび却下イベントを担当する調整コントローラーを設計することでした。デフォルトのCoordination Controllerは、フレームワーク内のすべてのデフォルトのビューコントローラーを提供します。すべてのビューコントローラーは、構成されたUIを提供することなく、関連するタスクを実行します。たとえば、1つのコントローラーはテンプレートセルを含むコレクションビューを表示し、特別なものは何も表示しません。この設計の利点は、コントローラー間の結合がなくなり、クライアントがデフォルトのコーディネーターをオーバーライドして、特定のタスクに対してまったく新しいビューコントローラーを返すことができることです。

私が抱えている問題は、このフレームワークを設計して、クライアントが独自のカスタムUIをアプリに追加できるようにする方法です。

アプローチ1

フレームワークにビューファクトリが必要になるようにし、このビューファクトリがすべての関連するビューの販売を担当するようにします。したがって、アプリデリゲートでは、クライアントがたとえば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つのデータソースを持つことによって実現されます。

これらのすべてのセルをカスタマイズ可能にするインターフェイスをどのように設計しますか?

9
Daniel G

これは古くて価値のある質問で、価値のある答えが得られなかったので、私の経験では、

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

しないでください。

クライアントがカスタマイズで行う選択を制限する-UIであるか他の何かであるかにかかわらず-ソリューションを簡素化し、サポートの負担を軽減するため、またクライアントにとっても、ほとんどの場合、ベンダーにとってより優れています。ベンダーの専門知識を活用して、時間を無駄にせずにソリューションスペースのスイートスポットに到達できます。

彼らが別のソリューションを必要とする場合、彼らはあなたに教えてくれます。カスタマイズを主張する場合、別のソリューションが必要であり、まだそれを知らないだけです。

1
Jonah Benton