0

J'ai un Popover qui a été défini dans un UIViewController, mais qui doit maintenant être présenté à partir d'un UICollectionViewCell personnalisé. Le present ne fonctionne plus car la classe est un UICollectionViewCell et non plus un UIViewController. Comment puis-je présenter le popover de la coutume UICollectionViewCell.Comment présenter un popoverPresentationController à partir de la carte personnalisée UICollectionViewCell NIB

@IBAction func period(_ sender: Any) { 

     let storyboard = UIStoryboard(name: "ScoreClockPopoverViewController", bundle: nil) 
     let scoreClockPopoverViewController = storyboard.instantiateViewController(withIdentifier: "ScoreClockPopoverViewController") as! ScoreClockPopoverViewController 

     scoreClockPopoverViewController.modalPresentationStyle = .popover 

     let popover = scoreClockPopoverViewController.popoverPresentationController! 
     popover.delegate = self 
     popover.permittedArrowDirections = .any 
     popover.sourceView = periodButton 
     popover.sourceRect = periodButton.bounds 


     present(scoreClockPopoverViewController, animated: true, completion:nil) 
     //Error: Use of unresolved identifier 'present' 

    } 

Si je tente d'étendre le UICollectionViewCell comme UIViewContoller je reçois l'erreur suivante: Extension of type 'HeaderCollectionViewCell' cannot inherit from class 'UIViewController'

+0

Vous souhaitez probablement que votre action 'period()' "rappelle" le View Controller, et laissez le View Controller gérer le chargement et la présentation du Popover. – DonMag

Répondre

0

Définir vos CollectionViewcontroller comme délégué de votre CollectionViewCell.

Lorsque la fonction de période sur votre CollectionViewCell est appelée, appelez la fonction "didClickPeriod" (que vous créez vous-même) du délégué de la cellule.

Incl. dans votre cellule

protocol HeaderCollectionViewCellDelegate { 
    func didClickPeriod(sender: Any) 
} 

assurez-vous que la cellule a une propriété

var delegate: HeaderCollectionViewCellDelegate! 

Notez le!. En supposant que vous instanciez à partir de Storyboard vous ne pouvez pas passer votre délégué sur l'instanciation mais devez le remplir "manuellement". Le ! indique fondamentalement que vous pouvez travailler avec cette propriété comme si elle était toujours définie - en supposant que vous remplissiez correctement la propriété, cela vous évitera de déballer tout le temps. Si vous ne le faites pas, vous recevrez un crash.

Dans votre fonction période ne se contentent

@IBAction func period(_ sender: Any) { 
    self.delegate.didClickPeriod(sender) 
} 

Dans votre CollectionViewController assurez-vous qu'il implémente le protocole par exemple en incluant

extension YourCollectionViewController: HeaderCollectionViewCellDelegate { 
    func didClickPeriod(sender: Any) { 
     // your previous presentation logic. 
     // But now you're in the CollectionViewController so you can do 
     ... 
     present(scoreClockPopoverViewController, animated: true, completion:nil) 

    } 
} 
+0

Merci pour ça. Cependant, je reçois une erreur fatale: trouvé de manière inattendue nil lors du déballage d'une valeur optionnelle, car le délégué est nul. J'ai essayé d'ajouter 'delegate = self comme? HeaderCollectionViewCellDelegate' à 'override func awakeFromNib() {' mais c'est toujours nul. –

+0

Ajouté delegate = soi au mauvais endroit, l'a ajouté à 'CollectionViewcontroller' –

+0

C'est ce que je voulais dire – MarkHim