トップレンガの問題私はいつも、コンポーネント間を渡すデータです。UIViewControllers、サービスとビュー間のデータ交換
私はいくつかのサブ問題で、この問題を分離することができます:
- 我々は、ビューにデータを渡す必要がありますか?ビューでモデルを直接変更する必要はありますか?
- ビューから直接サービスコールを使用することができます。または、すべての操作を
UIViewConrtoller
に戻す必要があります。コントローラが適切なサービスを要求します。 - 実際のモデルの代わりにインデックスを指定する。
最初の質問は、私たちがUITableViewCellを作成し、それに直接データを渡す場合を示しています。そこで、このデータオブジェクトのいくつかのプロパティを変更する機能が追加されました。具体的には、にUITableView
データソースを実装しているとします。あなたが次のように表示されたら、データモデルを直接ビューに設定します。例えば
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = viewController.theTableView.dequeueReusableCellWithIdentifier(String(SongTableViewCell.self)) as! SongTableViewCell
cell.song = songs[indexPath.row]
return cell
}
2つ目には、すべてのデリゲートの呼び出しを使用せずにSongTableViewCell
から直接、あなたのサービスで何かをトリガーにしたいとき。 SongTableViewCell
で私の曲を演奏したいと思います。このセルには再生ボタンがあります。だから、シンプルなソリューションです - 私は、たとえばUIButtonアクションtouch up inside
でセルを結合して、私のサービスに必要な操作を呼び出すことができます。
@IBAction func onTappedPlayButton(sender: AnyObject)
{
MusicService.playSong(song)
}
しかし、通常、私は別のことを行います。私は、コントローラおよびコントローラに何らかのアクションが何をすべきかを決定するバックパスというのが私の細胞にデリゲートのインスタンスを格納します。
@IBAction func onTappedPlayButton(sender: AnyObject)
{
delegate?.didTappedPlayButton()
}
この場合SongTableViewCell
は、次のようになります。
class SongTableViewCell: UITabeViewCell
{
weak var delegate:SongTableViewCellDelegate?
...
@IBAction func onTappedPlayButton(sender: AnyObject)
{
delegate?.didTappedPlayButton(index)
}
}
と私のビューコントローラがこれを実装しますdidTappedPlayButton
メソッドMusicService.playSong(song)
を呼び出します。モデルオブジェクトをUITableviewCell
にプッシュしていない場合は3番目の問題があります。コントローラから何らかの適切なソングを配列から再生する必要があるかどうかを確認する必要があります。ですから、私はUITableviewCell
に設定したインデックスを使用します。これは、他の開発者を混乱させることがあります。インデックスやデータモデルを使用する方が良いかどうかはわかりません。私は可変性の利点を理解しましたが、index
は開発者やデータモデルオブジェクトには何も言わず、多くのことを言います。
私はもっとアーキテクチャに関する質問があることを知っていますが、これらの3つのアプローチ/問題のいくつかの小道具と欠点を概説できます。