ios - 通过在嵌入式容器中的 Collection View 中选择一个单元格来更改 View Controller 中的值/图像

标签 ios objective-c swift uicollectionview uicontainerview

在细节 View Controller 中,我在左上角有一个“featureImage”,在它下面有一个细长的水平图像条。图像条是由自定义 CollectionViewController 管理的嵌入式容器 View ,它显示图像数组。初始 featureImage 是 images[0] 数组中的第一个图像,并将相同的数组传递给 Collection View 。

如果选择/点击容器 View 中的单元格,我希望 featureImage 更新为相同的图像。

我想我需要调用委托(delegate)方法 didSelectItemAtIndexPath,它会给我 indexPath。正确的?但是我如何将已经来自委托(delegate)的 indexPath 传递回详细 View Controller 。

已编辑 - 该代码显示了响应链和委托(delegate)方法之间的代码重叠和差异。在 didSelectItemAtIndex 路径中取消注释,响应链方法有效,而委托(delegate)方法无效。

协议(protocol)定义并包含在 DetailViewController 的顶部(我似乎并不关心协议(protocol)在哪个文件中,并且只键入类以允许委托(delegate)属性为“弱”)。两种方法都需要。

protocol FeatureImageController: class {
  func featureImageSelected(indexPath: NSIndexPath)
}
class DetailViewController: UIViewController, FeatureImageController {

在自定义 UICollectionViewController 类中声明的委托(delegate)属性。仅委托(delegate)方法需要。

 weak var delegate: FeatureImageController?

委托(delegate)属性在 DetailViewController 中启动。仅委托(delegate)方法需要。

    override func viewDidLoad() {
    super.viewDidLoad()

    let photoCollectionVC = PhotoCollectionVC()
    photoCollectionVC.delegate = self as FeatureImageController ... }

响应链(事件)或 Collection View Controller didSelectItemAtIndexPath 方法中的委托(delegate)方法(注释掉)。

    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 中的委托(delegate)方法。两者都需要。

func featureImageSelected(indexPath: NSIndexPath) {
    record?.featureImage = record?.images[indexPath.row]
    self.configureView()
}

最佳答案

根据我的经验,View Controller 之间的数据选择通信最好通过两种方式实现——委托(delegate)或响应链路由。无论哪种方式,第一步都是创建您的 DetailViewController 将遵守的协议(protocol)。像这样的东西:

protocol FeatureImageController: class {
    func featureImageSelected(image: UIImage)
}

然后您的 DetailViewController 将实现此功能并使用它来更改“功能图像”。这如何传达取决于您是使用委托(delegate)还是响应者链。

委派 如果您更喜欢使用委托(delegate),那么在您的 CollectionViewController 上声明一个委托(delegate)属性,如下所示:

weak var delegate: FeatureImageController?

然后在 didSelectItemAtIndexPath 中,您将使用提供的 indexPath 确定所选图像并将其传递给您的委托(delegate):

delegate?.featureImageSelected(selectedImage)

其中 selectedImage 是从 Collection View 中选择的图像。

响应链 如果您决定使用响应者链,则无需声明委托(delegate)属性。相反,您会要求第一个响应您的协议(protocol)方法的目标。所以在 didSelectItemAtIndexPath 里面你会说:

if let imageController = targetForAction("featureImageSelected:", withSender: self) as? FeatureImageController {
   imageController.featureImageSelected(selectedImage)
}

这两种方法(委托(delegate)或响应链)都允许 Collection View Controller 将其选择传递给细节 Controller 。委托(delegate)路由在框架中更为常见,但我发现当我们更频繁地在容器中使用容器时,在没有大量我不满意的“耦合”的情况下正确管理委托(delegate)链变得非常讨厌。另一方面,响应者链已经由框架提供,用于“挖掘” Controller 的层次结构以找到愿意处理您的操作的人。

关于ios - 通过在嵌入式容器中的 Collection View 中选择一个单元格来更改 View Controller 中的值/图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34025607/

相关文章:

objective-c - CoreData 列表中的排序和设置默认值

objective-c - 无法从 swift 设置 objective-c 属性

swift UITapGestureRecognizer 慢

ios - 带有项目的快速 slider

ios - 在应用内购买 iOS 中恢复交易

objective-c - 如何在 Objective C 中隐藏 Mac OS X 菜单栏

objective-c - NSPreferencePane 中的 NSToolbar

objective-c - 默认[NSTableViewDelegate tableView :sizeToFitWidthOfColumn:] doesn't get called

ios - Swift 4.2 无法将类型 '(UIImagePickerController.InfoKey).Type' 的值转换为预期的参数类型 'UIImagePickerController.InfoKey'

ios - iPhone X 上的 React Native 底部选项卡被隐藏