【问题标题】:Displaying image selected between collection view controllers显示在集合视图控制器之间选择的图像
【发布时间】:2018-02-26 17:00:34
【问题描述】:

我在First Collection View Controller 中有如下structs

struct Area{
    var name = String()
    var image = String()  
}
var area = [Area]()

Second Collection View Controller

struct AreaSelected {
   var imageSelected = String()
}
 var areaSelected = [AreaSelected]()

我想在Second Collection View Controller 中显示从First Collection View Controller 中选择的图像。

所以我这样做是为了将它们导航到 didSelectItemAt indexPath 的 Second Collection View Controller

   let indexPaths = self.areaCV!.indexPathsForSelectedItems!
   var indexPath = indexPaths[0] as IndexPath
   let detailViewController = self.storyboard?.instantiateViewController(withIdentifier: "SVC") as? SecondViewController
   detailViewController?.areaSelected = [self.area[(indexPath as NSIndexPath).item]]

我得到以下编译器错误

无法将“区域”类型的值转换为预期的元素类型 '区域选择'

如何摆脱这个错误?

【问题讨论】:

    标签: ios swift xcode struct didselectrowatindexpath


    【解决方案1】:

    基本上

     let selectedArea = self.area[(indexPath as NSIndexPath).item]
     detailViewController?.areaSelected = [AreaSelected(imageSelected: selectedArea.name)]
    

    PS:您在不同的视图控制器中使用了不同的(不兼容的)类型,所以绝对不能将它直接分配给彼此。

    PSS:在 ViewController 之间的 CellSelected 上设置 segue 更容易、更干净、更好,并在 func prepare(for segue:UIStoryboardSegue, sender: Any?) 中分配 areaSelected

    【讨论】:

    • 你能解释一下为什么它们不兼容吗?
    • 因为它们是不同的数据类型。您不能将一种数据类型的属性分配给采用不同类型的属性。
    • 第一个是var area = [Area](),第二个是var areaSelected = [AreaSelected]()
    • 感谢您的解释 :)
    【解决方案2】:

    错误信息非常清楚,您的第一个结构是类型:FirstCollectionViewController.Area,第二个结构的类型是 SecondCollectionViewController.AreaSelected。两者与IntString 一样不同,你不能像let number: Int = "Of course no" 那样将一个分配给另一个。但是你可以定义一个通用类型:

    protocol AreaDescription { 
        var image: String { get }
    }
    
    class FirstVC: ... {
    
        struct Area: AreaDescription {
            var name: String
            var image: String
        }
    }
    
    class SecondVC: ... {
    
        struct AreaSelected: AreaDescription {
            var name: String
            var image: String
        }
    }
    

    并将您的属性设置为:

    var areaSelected = [AreaDescription]()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2017-03-17
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      相关资源
      最近更新 更多