私はすべての新しいiOS開発者が次の問題を抱えていると確信しています。
これは、2つの基本的な画面と一般的な画面での外観です。
1)フォーム画面:
2)テーブルビューコントローラー画面
これまでに、2つの異なるソリューションについて読みました。
最初の解決策: https://bendyworks.com/single-responsibility-principle-ios/ 。これは通知に基づいており、View Controllerを(Intentions)View Modelから完全に分離するため、View Controllerのコードが削減されます。 Go-To構造と同様に、コードを壊すという欠点があると思います。次のようになります。
2番目のソリューションは、同じ混雑したビューコントローラーを維持します(ボタンアクションはVCなどの中で実行されます)。ただし、 TPKeyboardAvoiding 、BlocksKitなどのライブラリを使用します。この2番目のソリューションでは、コードは大幅に削減されますが、View Controllerには依然として多くの責任があります。
これらのソリューションについてどう思いますか?どちらが良いですか?もっと良いものはありますか?
MVVMを使用してこの問題を解決できます。
Model-View-ViewModel、または一般的に知られているMVVMパターンは、UIデザインパターンです。 VMは、VCからUIのモデルデータを準備するためのすべてのロジックを取ります。
例:
いくつかのフィールドを持つモデルオブジェクトがあり、それらのいくつかをフォーマットして計算を行い、それらを結合したいとします。
MVCの場合、そのすべてのロジックはViewControllerにあります。
MVVMでは、すべてをVCからVMに移動します。
VMはUIのすべてのデータを準備し、VCはこのように設定するだけです。
(VCクラス)
self.descriptionLabel = self.viewModel.textForDescriptionLabel;
チュートリアルとトピック:
以前に巨大なサイズのビューコントローラーでコードを解く必要がありましたが、最初はコンテンツをナビゲートする能力が本当に妨げられていました。私が気付いた重要なことの1つは、View Controllerのサイズだけでは、物事を分解するのに十分な理由ではないということです。大きなファイルが1つあることと、小さなファイルがたくさんあることには複雑さが伴います。ビューコントローラーを小さな部分に分解するためにリファクタリングする正当な理由は次のとおりです。
ビューコントローラーは、ビューとモデルをつなぐ接着剤である以上のことをすべきではありません。ネットワーク接続コード、画像操作コードなどがたくさんある場合は、それらをヘルパークラスに分割することを検討してください。
画面上にView Controllerをデータソースとして持つ多数のコントロールがある場合は、それらを個別のデータソースオブジェクトに分割し、それらをデータソースにすることを検討してください。または、それらを個別のView Controllerに分割することもできます(View Controllerに他のコントローラーに加えてテーブルビューがある場合、それを独自のTable View Controllerクラスに分割することができます)。
異なるビューコントローラーにまったく同じコードがある場合、それを1つの共有場所に配置します。これにより、コードが再利用可能になり、複雑さの管理に役立ちます。
以下は、View Controllerの複雑さを最小限に抑えるための追加のアドバイスです。
プログラマティックの代わりにストーリーボード
ビュー要素の作成は多くのコードであり、フレームジオメトリコードも多くの作業です。自動レイアウト制約の使用と、可能な限り多くのビュー要素をストーリーボードに配置することをまだ検討していない場合。
不要なコード/コメント
また、不要なコードやコメントは必ず削除してください。多くの場合、新しいView Controllerファイルには、使用していないメソッドが含まれています。 didReceiveMemoryWarning
のような方法を使用していない場合は、安全に削除できます。また、View Controllerファイルは非常に大きいため、古いコードやコメントを削除するのが怖い場合があります。それを延期しないでください!複雑さを増すだけです。
通知
通知に関する質問への回答:通知は、すべてで使用するゴールデンハンマーではありません。 1つの特定のアクションのために複数のView Controllerを同時に更新する必要がある場合、通知が役立つと思います。ただし、通知に注意してください。通知を使いすぎると、それらを追跡しようとするときに多くの苦痛を引き起こす可能性があります。
VIPERと呼ばれる特別なアーキテクチャが1つあります(ビュー、インタラクター、プレゼンター、エンティティ、ルーティング)。ここであなたが知っておくべきことを再開してみます:
ビュー
プレゼンター
ルーティング
だから、私はあなたがあなたのコードをきれいにすると思う:
データ検証はPresenterレイヤーに移動します。
ナビゲーションはワイヤーフレームオブジェクト(Routingレイヤー)に移動します。
[〜#〜] dry [〜#〜] 原則を観察しながらビューコントローラを分割します。
複雑な画面には、2つ以上のビューとプレゼンターがあります。
VIPERアーキテクチャに関する次のリンクが表示されます http://mutualmobile.github.io/blog/2013/12/04/viper-introduction/
幸運を祈ります!