UIViewControllers,服务和视图之间的数据交换

时间:2016-09-02 13:54:00

标签: ios uitableview core-data model-view-controller

我每次面对的顶级砖问题都是组件之间的传递数据。

我可以在几个子问题中分离这个问题:

  1. 我们需要将数据传递给视图吗?我们是否需要直接在视图中更改模型?
  2. 我们可以直接从视图中使用某些服务调用,或者我们需要将所有操作传递回UIViewConrtoller,然后控制器才会请求适当的服务。
  3. 指定索引而不是真实模型。
  4. 因此,第一个问题展示了我们创建UITableViewCell并直接传递给它的情况。所以我们现在有能力修改这个数据对象的一些属性。我们假设我们PlayListViewController实现了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
      }
    

    第二个例如,当您想直接从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的{​​{1}}方法。这是第三个问题,如果我们没有将模型对象推入MusicService.playSong(song),那么我们需要以某种方式说控制器它需要从数组中播放一些合适的歌曲。所以我使用我设置到UITableviewCell的索引,这有时会纠缠其他开发人员。我不知道使用索引或数据模型是否更好。我理解可变性的优点,但UITableviewCell对开发人员说什么,数据模型对象说了很多。

    我知道更多的架构问题,但也许我们可以概述这些方法/问题的一些道具和缺点。

1 个答案:

答案 0 :(得分:0)

我找到了post并且说

类=更复杂。值=复杂性较低。不确定它是否适合我所有的子问题,但可能比将其传递给全班更好。