到目前为止,让我解释一下我的应用程序......
我将口袋妖怪数据存储在名为objects
的字典中。
第一个VC - >用户选择一个口袋妖怪角色,所选的口袋妖怪的细节被添加到另一个词典。
用户然后按下一个按钮,将它们带到第二个VC(collectionViewController
) - >他们选择的口袋妖怪数据也会被传递并存储到名为selectedPokemonObject
如果我print(selectedPokemonObject)
我可以看到用户选择的数据,那么我知道数据正在传递给第二个VC。
在collectionViewController
中,我想展示与用户选择的口袋妖怪具有相同"type"
的口袋妖怪。
我创建了一个过滤此变量的变量:
var filteredObjects = objects.filter{ ($0["type"] == selectedPokemonObject["type"])}
此代码不起作用 - 它给出了错误:
Instance member 'selectedPokemonObject' cannot be used on type 'CollectionViewController'
我不明白为什么会这样。
我已经看到围绕这个问题已经发布了一些问题,但是对它们中的任何一个都没有意义 - 他们的答案并没有真正帮助我解决我的问题,所以我很感激任何帮助。我如何在我的代码中使用它?
我的完整代码如下CollectionViewController
:
class CollectionViewController: UICollectionViewController {
var selectedPokemonObject = [String:String]()
override func viewDidLoad() {
super.viewDidLoad()
title = "Pokémon"
print(selectedPokemonObject)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
// MARK: UICollectionViewDataSource
var filteredObjects = objects.filter{ ($0["type"] == selectedPokemonObject["type"])}.filter{ ($0["typeTwo"] == selectedPokemonObject["typeTwo"])}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return filteredObjects.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell
let object = filteredObjects[indexPath.row]
cell.pokemonName.text = object["name"]!
cell.pokemonImage.image = UIImage(named: "\(object["id"]!)"+"\(object["name"]!)")
return cell
}
}
更新
objects
数据作为全局变量存储在名为Data.swift
的文件中,因此我可以在任何地方访问它。
答案 0 :(得分:1)
有些事情我不同意您的代码,但我会首先帮助您修复错误。 Swift不喜欢你使用实例化变量来帮助你实例化另一个变量。 Swift无法知道哪一个将首先被初始化。而是将它们初始化为空,并在viewDidLoad()
中设置它们的值,这将在UITableViewDataSource/Delegate
方法之前运行。确定filteredObjects
和objects
是相同的结构。 I. E. [[String : String]]
var selectedPokemonObject = [String:String]()
var filteredObjects = [[ String:String ]]()
所以你如何过滤是错误的。你基本上是在说“我过滤掉所有口袋妖怪,除了那些与我的口袋妖怪具有相同第一类型的口袋妖怪。然后我再次过滤它们,直到我只得到那个具有相同第二类型的小口袋妖怪。”因为我对口袋妖怪知之甚少,但很少有相同的类型。这将为您提供有限的Poke领域。而是尝试这样的事情。
override func viewDidLoad() {
super.viewDidLoad()
filteredObjects = objects.filter { $0["type"] == selectedPokemon["type"] || $0["typeTwo"] == selectedPokemon["typeTwo] }
}
此过滤说明如果类型一或类型二匹配,它们将在我们的过滤器列表中。或者,您可以尝试添加语句,如果所选口袋妖怪的类型1与pokemom的类型2匹配,它将进入过滤等等。