2017-02-02 1 views
1

J'utilise des storyboards et une tableview. Chaque cellule de ma vue de table contient un UIView. Est-il possible de remplacer le IBOutlet de ce UIView par programme? Par exemple, faire quelque chose comme ceci:Remplacer la vue IBOutlet par le code

class CustomTableViewCell: UITableViewCell { 
    @IBOutlet weak var videoPlayerView: UIView! /// Really this is a VIMVideoPLayerView (from library below) which inherits from UIView. 

    func configureCell(with customObject: CustomObject) { 

     // Set the IBOutlet in code here. 
     self.videoPlayerView = customObject.videoPlayerView 
    } 
} 

Si j'essaie de faire cela, rien ne se passe.

Je sais que beaucoup de gens vont demander: "Pourquoi voulez-vous faire cela?". Ici, ça va: J'utilise cette bibliothèque VIMVideoPlayer et je crée le lecteur réel qui contient un UIView dans le code. Au lieu de réutiliser les joueurs, je les crée tous en même temps dans le code et je veux maintenant les afficher. Cela se résume à des raisons de performance, en reclassant le défilement et le retard sur le thread principal.

REMARQUE: Je travaille déjà sur le code mais je souhaite vraiment utiliser des storyboards. La façon dont je l'ai fait travailler dans le code est en faisant ceci: videoHolderView.addSubview(customObject.videoPlayerView)

Des pensées?

+0

En résumé, vous souhaitez ajouter une sous-vue de lecture vidéo. Vous pouvez l'ajouter vous-même, mais vous devrez également ajouter des contraintes dans le code. Vous pouvez également l'ajouter en tant que sous-vue d'une vue configurée avec des contraintes dans IB. Il n'y a vraiment pas d'autres choix. Ce que j'aimerais savoir, c'est ce qui ne va pas avec l'option subview? La question dit "défilement et retard". Quel est le problème là-bas, et pourquoi ce problème disparaîtrait-il si vous abandonniez le point de vente UIView? – danh

Répondre

1

modifiant la variable est très bien, mais cela ne changera pas la hiérarchie de la vue. Vous devrez insérer la nouvelle vue dans la vue d'ensemble des vues d'origine, puis supprimer l'ancienne vue. Gardez à l'esprit que cela ne conservera aucune contrainte de disposition, vous devrez les recréer après avoir ajouté la vue de remplacement.

class CustomTableViewCell: UITableViewCell { 
    @IBOutlet weak var videoPlayerView: UIView! /// Really this is a VIMVideoPLayerView (from library below) which inherits from UIView. 

    func configureCell(with customObject: CustomObject) { 
     // Replace the view by inserting a new view into the same location 
     // in the view hierarchy 
     let newVideoPlayerView = customObject.videoPlayerView 
     videoPlayerView.superview.insertSubview(newVideoPlayerView, belowSubview: videoPlayerView) 
     videoPlayerView.removeFromSuperview() 

     // Set the IBOutlet in code here. 
     videoPlayerView = newVideoPlayerView 

     // TODO: Recreate your layout constraints 
    } 
} 
+0

Je copie/colle mon commentaire depuis la réponse ci-dessous: Y a-t-il un moyen de le faire sans avoir à supprimer et à rajouter des contraintes? L'avantage du storyboard était parce que j'ai de la parallaxe et cela dépend de certaines contraintes, donc je n'aurais pas beaucoup d'avantages à passer aux storyboards. – JEL

+0

Non, mais vous pouvez simplifier les contraintes en utilisant une autre vue comme enveloppe, qui contient uniquement cette vue enfant unique que vous avez l'intention de remplacer. Vous pouvez ensuite ajouter des contraintes top/left/bottom/right simples à cette vue parent. – kevin

+0

Je vois, je ne vois vraiment aucun avantage à faire ça alors. Pensez-vous qu'il y a des avantages ici avec cette approche de storyboard? Encore une fois, ce que je suis en train de faire est de créer les vues dans le code puis de faire 'videoHolderView.addSubview (customObject.videoPlayerView)' – JEL

0

Vous pouvez le faire, mais tout ce que fait votre code actuel est la mise à jour de la propriété. Vous devez supprimer la vue existante de la hiérarchie de vues et ajouter la nouvelle vue en tant que sous-vue.

func configureCell(with customObject: CustomObject) { 

    // Set the IBOutlet in code here. 

    self.videoPlayerView.removeFromSuperview() 

    self.videoPlayerView = customObject.videoPlayerView 

    self.addSubView(self.videoPlayerView) 

} 

Notez que vous pouvez également ajouter des contraintes qui sont nécessaires pour la nouvelle vue

+0

Y at-il un moyen de le faire sans avoir à supprimer et ensuite ajouter des contraintes à nouveau? L'avantage du storyboard était parce que j'ai de la parallaxe et cela dépend de certaines contraintes, donc je n'aurais pas beaucoup d'avantages à passer aux storyboards. – JEL