2016-09-02 14 views
0

トップレンガの問題私はいつも、コンポーネント間を渡すデータです。UIViewControllers、サービスとビュー間のデータ交換

私はいくつかのサブ問題で、この問題を分離することができます:

  1. 我々は、ビューにデータを渡す必要がありますか?ビューでモデルを直接変更する必要はありますか?
  2. ビューから直接サービスコールを使用することができます。または、すべての操作をUIViewConrtollerに戻す必要があります。コントローラが適切なサービスを要求します。
  3. 実際のモデルの代わりにインデックスを指定する。

最初の質問は、私たちが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つのアプローチ/問題のいくつかの小道具と欠点を概説できます。

答えて

0

私はpostを発見し、それは

クラス=より多くの複雑さを語ります。値=複雑さの軽減。それは私のすべてのsubquestionに合っているかもしれませんが、多分クラス全体を通過する価値があるかもしれません。

関連する問題