【发布时间】:2023-04-07 03:04:01
【问题描述】:
我每次遇到的最大难题是组件之间的数据传递。
我可以把这个问题分成几个子问题:
- 我们需要将数据传递给视图吗?我们需要直接在视图中更改模型吗?
- 我们可以直接从视图使用一些服务调用,或者我们需要将所有操作传递回
UIViewConrtoller,然后控制器才会请求适当的服务。 - 指定索引而不是实际模型。
所以第一个问题演示了我们创建 UITableViewCell 并将数据直接传递给它的情况。所以我们现在有能力修改这个数据对象的一些属性。假设我们有实现UITableView 数据源的PlayListViewController。如果您看到下面我将数据模型直接设置到视图中。
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 方法,它调用MusicService.playSong(song)。这是第三个问题,如果我们没有将模型对象推入UITableviewCell,那么我们需要以某种方式告诉控制器它需要从数组中播放一些合适的歌曲。所以我使用我在UITableviewCell 中设置的索引,这有时会困扰其他开发人员。我不知道使用索引或数据模型是否更好。我理解可变性的优势,但index 对开发人员无话可说,数据模型对象说了很多。
我知道这更多的是架构问题,但也许我们可以概述这 3 种方法/问题的一些优点和缺点。
【问题讨论】:
标签: ios uitableview core-data model-view-controller