通过在嵌入式容器

时间:2015-12-01 16:48:49

标签: ios objective-c swift uicollectionview uicontainerview

在详细视图控制器中,我有一个' 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()
}

1 个答案:

答案 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)
}

两种方法(委托或响应者链)都允许集合视图控制器将其选择传递给详细控制器。委托路径在框架中更常见,但我发现,当我们更频繁地在容器中使用容器时,如果没有一定程度的“耦合”,我就会非常讨厌管理委托链。另一方面,响应者链已经由框架提供,以“挖掘”到控制器的层次结构中,以找到愿意处理您的行为的人。