我每次面对的顶级砖问题都是组件之间的传递数据。
我可以在几个子问题中分离这个问题:
UIViewConrtoller
,然后控制器才会请求适当的服务。因此,第一个问题展示了我们创建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
对开发人员说什么,数据模型对象说了很多。
我知道更多的架构问题,但也许我们可以概述这些方法/问题的一些道具和缺点。