在细节 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/