在详细视图控制器中,我有一个' featureImage'在左上方,以及在此下方的薄水平条带图片。图像条带是由自定义CollectionViewController管理的嵌入式容器视图,它显示了一组图像。初始的featureImage是图像数组[0]中的第一个图像,同一个数组被传递给集合视图。
如果选择/点击容器视图中的单元格,我希望featureImage更新为同一图像。
我想我需要调用委托方法didSelectItemAtIndexPath,它会给我indexPath。对?但是,我如何将indexPath(已经从委托)传递回详细视图控制器。
已编辑 - 代码显示代码重叠以及响应者链和委托方法之间的差异。在didSelectItemAtIndex路径中取消注释,响应者链方法有效,而委托方法则没有。
协议定义并包含在DetailViewController的顶部(我似乎并不重要协议所在的文件,并且只对类进行输入以允许委托属性为“弱”') 。这两种方法都需要。
protocol FeatureImageController: class {
func featureImageSelected(indexPath: NSIndexPath)
}
class DetailViewController: UIViewController, FeatureImageController {
在自定义UICollectionViewController类中声明的委托属性。只有委托方法才需要。
weak var delegate: FeatureImageController?
在DetailViewController中启动的委托属性。只有委托方法才需要。
override func viewDidLoad() {
super.viewDidLoad()
let photoCollectionVC = PhotoCollectionVC()
photoCollectionVC.delegate = self as FeatureImageController ... }
集合视图控制器didSelectItemAtIndexPath方法中的响应者链(活动)或委托方法(已注释掉)。
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
{
if let imageSelector = targetForAction("featureImageSelected:", withSender: self) as? FeatureImageController {
imageSelector.featureImageSelected(indexPath)
}
// self.delegate?.featureImageSelected(indexPath)
}
DetailViewController中的委托方法。两者都需要。
func featureImageSelected(indexPath: NSIndexPath) {
record?.featureImage = record?.images[indexPath.row]
self.configureView()
}
答案 0 :(得分:2)
根据我的经验,视图控制器之间的数据选择通信可以通过两种方式实现 - 委托或响应者链路。无论哪种方式,第一步都是创建DetailViewController将遵循的协议。类似的东西:
protocol FeatureImageController: class {
func featureImageSelected(image: UIImage)
}
然后,您的DetailViewController将实现此功能并使用它来更改“功能图像”。然后如何传达这取决于您是使用委托还是响应者链。
<强>团强> 如果您更喜欢使用委托,那么在CollectionViewController上声明一个委托属性,如下所示:
weak var delegate: FeatureImageController?
然后在didSelectItemAtIndexPath中,您将使用提供的indexPath确定所选图像并将其传递给您的委托:
delegate?.featureImageSelected(selectedImage)
其中selectedImage是从集合视图中选择的图像。
响应者链 如果您决定使用响应链,则无需声明委托属性。相反,您会要求第一个响应协议方法的目标。所以在didSelectItemAtIndexPath中你会说:
if let imageController = targetForAction("featureImageSelected:", withSender: self) as? FeatureImageController {
imageController.featureImageSelected(selectedImage)
}
两种方法(委托或响应者链)都允许集合视图控制器将其选择传递给详细控制器。委托路径在框架中更常见,但我发现,当我们更频繁地在容器中使用容器时,如果没有一定程度的“耦合”,我就会非常讨厌管理委托链。另一方面,响应者链已经由框架提供,以“挖掘”到控制器的层次结构中,以找到愿意处理您的行为的人。