2017-01-23 1 views
0

Я создаю приложение pokedex и способ, которым я хочу, чтобы он работал, в основном есть скроллер в верхней части экрана, который позволяет вам выбрать любой покемон и при выборе покемонов , под скроллером появится запись для покемонов (bulbasaur будет там по умолчанию, пока не будет выбран покемон, потому что bulbasaur - первый покемон с идентификатором 1). Чтобы достичь этого, у меня есть контроллер представления, который возвращает два типа ячеек, первый из которых является «ячейкой выбора», которая является скроллером, а вторая является «ячейкой описания», которая является записью dex. Я дал контроллеру представления элемент данных, называемый входом dex и возвращающим dex в функции cellForItemAt, но изображение ячейки не меняется (от bulbasaur до того, что выбирается покемон). Я печатаю на консоли то, что является значением pokemon записи dex каждый раз, когда выбран pokemon, поэтому я уверен, что запись dex напрямую изменена, но я не знаю, почему изображение тоже не меняется. Ниже приведены соответствующие части моего кода.Передача данных из пользовательской ячейки пользовательского интерфейса для просмотра контроллера

контроллер представления (только часть его):

import UIKit 

class PokeDexController: UICollectionViewController, UICollectionViewDelegateFlowLayout { 
var dexEntry = DescriptionCell() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.title = "PokeDex 386" 
    collectionView?.backgroundColor = UIColor(red: 52/255.0, green: 55/255.0, blue: 64/255.0, alpha: 1.0) 
    //collectionView?.backgroundColor = UIColor.white 

    collectionView?.register(chooserCell.self, forCellWithReuseIdentifier: cellID) 
    collectionView?.register(DescriptionCell.self, forCellWithReuseIdentifier: descID) 

} 

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    if (indexPath.row == 0) 
    { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath) as! chooserCell 
     return cell 
    } 
    else{ 
     let descCell = collectionView.dequeueReusableCell(withReuseIdentifier: descID, for: indexPath) as! DescriptionCell 
     dexEntry = descCell 
     return dexEntry 
    } 
} 

descriptionCell класс:

import UIKit 

class DescriptionCell: UICollectionViewCell 
{ 
    private var pokemon : Pokemon? 
    { 
    didSet 
    { 
     if let id = pokemon?._id 
     { 
      imageView.image = UIImage(named: String(id)) 
      print("Pokemon with the id of " + String(id)) 
     } 
    } 
} 

override init(frame: CGRect) 
{ 
    super.init(frame: frame) 
    setupViews() 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

func setPokemon(poke: Pokemon) 
{ 
    self.pokemon = poke 
} 

func getPokemon() -> Pokemon 
{ 
    return pokemon! 
} 

let imageView: UIImageView = 
    { 
     let iv = UIImageView() 

     iv.image = UIImage(named: "1") 
     iv.contentMode = .scaleAspectFill 

     return iv 
}() 

func setupViews() 
{ 
    backgroundColor = UIColor(red: 52/255.0, green: 55/255.0, blue: 64/255.0, alpha: 1.0) 
    addSubview(imageView) 

    imageView.frame = (CGRect(x: frame.width/6, y: frame.height/30, width: frame.width/4, height: frame.height/4)) 
} 

}

choosercell класс (в частности, didSelectItemAt):

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){ 
    let poke = pokemon[indexPath.row] 
    print("Selected " + poke._name) 

    let vc = PokeDexController() 
    vc.dexEntry.setPokemon(poke: poke) 

    let name = vc.dexEntry.getPokemon()._name 
    print(name ?? "nothing there") 
} 

image of the app and the console output

всякая помощь приветствуется, спасибо.

+0

Попробуйте добавить collectionView.reloadItems (в indexPaths: [indexPath]) в didSelectItemAt в вашем классе choosercell – chickenparm

+0

@chickenparm, можете ли вы объяснить, как это может потенциально помочь? –

+0

К сожалению, это не помогло –

ответ

0

Вам необходимо изменить dexEntry, когда вы выберете ячейку и перезагрузите ячейку просмотра коллекции.

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){ 
    let poke = pokemon[indexPath.row] 
    print("Selected " + poke._name) 

    let cell = collectionView.cellForItem(at: IndexPath(row: 1, section: 0) as! DescriptionCell 
    cell.setPokemon(poke: poke) 

    collectionView.reloadItems(at: IndexPath(row: 1, section: 0)) 
} 

Надеюсь, это поможет.

0

Я не решил свою проблему, но я понимаю, что ячейка, которую я возвращаю в свой viewController, не зависит от dexEntry, насколько я могу использовать ячейку, когда эта ячейка установлена, она установлена, поэтому я теперь будет выяснять, как перезагружать вещи, когда ячейка выбрана, чтобы возвращаемая ячейка имела изображение другого покемона.

Смежные вопросы