如何保存多个阵列的图像名称?

时间:2016-12-13 06:56:42

标签: ios swift collections segue

我正在cellImageName CitySelectViewController中尝试保存图片名称(显示为错误行上方的评论)。

ViewController.swift

var selectedImages = [String : UIImage ]()

let cityImages: [String : UIImage] = [ "City00" : UIImage(named: "city_00")!  , "City01" :UIImage(named: "city_01")!, "City02" : UIImage(named: "city_02")!]

let townImages: [String : UIImage] = [ "Town00" : UIImage(named: "town_00")!  , "Town01" :UIImage(named: "town_01")!, "Town02" : UIImage(named: "town_02")!]

let cityBImages: [String : UIImage] = [ "CityB00" : UIImage(named: "city_B00")!  , "CityB01" :UIImage(named: "city_B01")!, "CityB02" : UIImage(named: "city_B02")!]

let townBImages: [String : UIImage] = [ "TownB00" : UIImage(named: "town_B00")!  , "TownB01" :UIImage(named: "town_B01")!, "TownB02" : UIImage(named: "town_B02")!]

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        as! CollectionViewCell

    // Ambiguous reference to member 'subscript'
    cell.imageView?.image = self.selectedImages[(indexPath as NSIndexPath).item]

    return cell
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showOptions"
    {
        let indexPaths = self.collectionView!.indexPathsForSelectedItems!
        var indexPath = indexPaths[0] as IndexPath
        let CityVC = segue.destination as! CitySelectViewController


        if (indexPath.row == 2)
        {
            if self.areas == city
            {
                CityVC.imageSelected =  cityBImages
            }
            else
                if self.areas == town
                {
                    CityVC.imageSelected =  townBImages
            }
            else
            // Ambiguous reference to member 'subscript'
            CityVC.imageSelected = self.selectedImages[(indexPath as NSIndexPath).item]
        }

如何摆脱这些错误?

        This is `CitySelectViewController.swift`

        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

            return self.imageSelected.count

        }


        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
                as! CityCollectionViewCell

            cell.imageView?.image =  imageSelected[(indexPath as NSIndexPath).row]

            return cell
        }

        func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            let cell = collectionView.cellForItem(at: indexPath)

            cellImage = imageSelected[(indexPath as NSIndexPath).row]
            cellImageName = imageSelected[(indexPath as NSIndexPath).row]
  }

2 个答案:

答案 0 :(得分:1)

根据我对previous question

的回答中的代码

您可以简单地创建一个数组数组,并将每个数组放入集合视图中自己的部分:

struct City {         var name:String         var imageName:String     }

class firstViewController: UIViewController // Or UICollectionViewController 

let cities = [City(name:"City00", imageName:"city_00"),
              City(name:"City01", imageName:"city_01"),
              City(name:"City02", imageName:"city_02")]

let towns = [City(name:"Town00", imageName:"town_00"),
              City(name:"Town01", imageName:"town_01"),
              City(name:"Town02", imageName:"town_02")]

let villages = [City(name:"Village00", imageName:"village_00"),
              City(name:"Village01", imageName:"village_01"),
              City(name:"Village02", imageName:"village_02")]

let allPlaces = [cities, towns, villages]

func numberOfSections(in collectionView: UICollectionView) -> Int {
     return self.allPlaces.count
}

func collectionView(_ collectionView: UICollectionView, 
 numberOfItemsInSection section: Int) -> Int {
    let places = self.allPlaces[section]
    return places.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
    as! CollectionViewCell

    let places = self.allCities[indexPath.section]

    let city = places[indexPath.item]

    cell.imageView?.image = UIImage(named:city.imageName)

    return cell
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showOptions" {
        if let indexPaths = self.collectionView!.indexPathsForSelectedItems {
            if let cityVC = segue.destination as? CitySelectViewController {
                var selectedCities = [City]()
                for indexPath in indexPaths {
                    let places = self.allPlaces[indexPath.section]
                    selectedCities.append(places[indexPath.item])
                }
                cityVC.selectedCities = selectedCities
            }
        }
    }
}

答案 1 :(得分:0)

首先,你的selectedImage永远不会被填充(或者至少在你提供的代码中),所以它总是一个空字典。其次,为什么你将indexPath转发到cellForItemAt中的NSIndexpath?

cell.imageView?.image =  imageSelected[(indexPath as NSIndexPath).row]

你的字典也是[String:UIImage]的类型,你将其视为[Int:UIImage]。

当你打算使用indexpath时,可以使用数组而不是[Int,UIImage]。