このリポジトリは、消費ではなくデモンストレーションのために作成されました。ただし、このリポジトリのフィードバックと使用法を考慮して、ここで維持し始め、固定/実装の問題を実装します。
MVVM ? Appleが推奨するMVCはなぜですか? AndroidはMVPを素晴らしいですよね?クールなバイパーパターンはどうですか?各パターンがテーブルにもたらすものを説明するためにすでに多大な努力が払われているので、ここでのアイデアは議論に追加することではなく、単に私がすでに形成した意見に加えて構築することです。MVVMは行く方法です。
MVVMの素早い入門書として、それはビューモデルがモデルを提供するデータとビューを提供するデータを媒介するデザインパターンと、以下に示すように提供されるデータを表示するビューを媒介します。

iOSでは、 Viewは基本的にViewControllerであり、ViewModelはレンダリングするビューの正確なデータを提供するオブジェクト(構造)です。
これにより、メンテナンス可能な(非常に薄いビューコントローラー)とテスト可能なゆるい結合アーキテクチャが提供されます(ViewModel Abstracts out out out out au uiを使用するため、簡単にテストできます)
ただし、警告はまだあります。クラシックMVVMは、モデルがドメインモデルとしてモデルの場合に簡単に(そして美しく)簡単に(そして美しく)簡単に可能になります。ただし、貧血モデル(一般的に十分に書かれたAPIがある場合に当てはまる場合)の場合、データとナビゲーションの流れを促進する別のメディエーターまたはプレゼンターも必要です。
現在、ビューモデルには、ビューを更新する責任があり、ユーザーによる変更に関するビューから更新を取得する責任があります。これは、双方向のデータ結合を使用して最小コードで達成できます。しかし… iOSには、箱から出して利用できる双方向の結合メカニズムはありません!
幸いなことに、rxswift、rxcocoaのようなリアクティブライブラリがありますが、双方向の結合がリアクティブプログラミングパラダイムの非常に小さな部分であることを考えると、それらは重すぎます。 SimpletWowaybindingは、単純な控えめな方法で、双方向のバインディングを提供するよう努めています!
プロジェクトのサンプルを実行するには、リポジトリをクローンし、最初にディレクトリの例からpod installを実行します。
import SimpleTwoWayBinding
struct FormViewModel {
let name : Observable < String > = Observable ( )
let companyName : Observable < String > = Observable ( )
let yearsOfExperience : Observable < Double > = Observable ( )
let isCurrentEmployer : Observable < Bool > = Observable ( false )
let approxSalary : Observable < Float > = Observable ( )
let comments : Observable < String > = Observable ( )
}ビューに対して「バインド可能」になりたいプロパティは、観察可能であると宣言する必要があります。
class ViewController : UIViewController {
@ IBOutlet weak var nameField : UITextField !
@ IBOutlet weak var companyField : UITextField !
@ IBOutlet weak var isCurrentEmployerSwitch : UISwitch !
@ IBOutlet weak var yearsOfExperienceStepper : UIStepper !
@ IBOutlet weak var salaryRangeSlider : UISlider !
@ IBOutlet weak var selectedSalaryRangeLabel : UILabel !
@ IBOutlet weak var selectedYearsOfExperienceLabel : UILabel !
var viewModel : FormViewModel !
override func viewWillAppear ( _ animated : Bool ) {
super . viewWillAppear ( animated )
self . navigationItem . title = " Survey Form "
setupBindings ( )
}
func setupBindings ( ) {
nameField . bind ( with : viewModel . name )
companyField . bind ( with : viewModel . companyName )
isCurrentEmployerSwitch . bind ( with : viewModel . isCurrentEmployer )
yearsOfExperienceStepper . bind ( with : viewModel . yearsOfExperience )
salaryRangeSlider . bind ( with : viewModel . approxSalary )
selectedSalaryRangeLabel . observe ( for : viewModel . approxSalary ) {
[ unowned self ] ( _ ) in
self . selectedSalaryRangeLabel . text =
self . viewModel . getSalaryString ( )
}
selectedYearsOfExperienceLabel . observe ( for : viewModel . yearsOfExperience ) {
[ unowned self ] ( _ ) in
self . selectedYearsOfExperienceLabel . text =
self . viewModel . getExperienceString ( )
}
}
} Uicontrolのbindメソッドは、観測可能な双方向の結合を調整します。これは、フォームを機能させるために必要なすべてのコードです。以下のスクリーンショットを参照してください。
simpletwowaybindingは、cocoapodsから入手できます。インストールするには、次の行をPodfileに追加するだけです。
pod 'SimpleTwoWayBinding' マニッシュカトーチ、[email protected]
SimpleTWowaybindingは、MITライセンスの下で利用できます。詳細については、ライセンスファイルを参照してください。