2017-08-24 1 views
0

J'ai un UITableViewController avec une liste de coutume UITableViewCells. La cellule a du texte, qui est parfois long. Je tronque cela à 2 lignes dans la table.Intégrer UITableViewCell personnalisé dans un autre UIView personnalisé?

Lorsqu'un utilisateur touche la cellule, je veux créer un UIView comme un pop-up avec exactement les mêmes informations que le UITableViewCell, avec l'ajout d'un en-tête au-dessus du contenu UITableViewCell. Donc, pour l'essentiel, je veux quelque chose comme ce qui suit: enter image description here

J'ai construit VersePopupView comme indiqué dans l'image, où le texte « en-tête personnalisé » est en fait un UILabel. J'ai instancié la vue à partir du fichier XIB et correctement défini le texte UILabel, mais le UITableViewCell personnalisé n'apparaît pas, même si j'ai également affecté cette valeur. Mes IBOutlet s sont tous branchés sur IB.

Voici mon instanciation:

 let popupView: VersePopupView = VersePopupView.instanceFromNib() 
     popupView.frame = CGRect(x: 10, y: 100, width: 300, height: 100) 
     popupView.assignVerseTableViewCell(cell: cell) 

     window.addSubview(popupView) 
     window.makeKeyAndVisible() 

Et voici ma classe VersePopupView:

class VersePopupView: UIView { 

    @IBOutlet weak var cell: VerseTableViewCell! 
    @IBOutlet weak var title: UILabel! 
    @IBOutlet weak var headerView: UIView! 

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

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    class func instanceFromNib() -> VersePopupView { 
     return UINib(nibName: "VersePopupView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! VersePopupView 
    } 


    func assignVerseTableViewCell(cell: VerseTableViewCell) 
    { 
     // Assign it 
     self.cell = cell 

     // Get the verse details 
     if let verseDetails = cell.verse_details { 

      self.title.text = verseDetails.verseReference() 

      // Adjust the frame 

      // Adjust the text to be attributed text 

      // Set the title to the verse reference 

      // Anything else? 

     } 
    } 
} 

Qu'est-ce que je fais mal ce que le UITableViewCell n'apparaît pas?

Y a-t-il un meilleur modèle pour cela plutôt que d'incorporer UITableViewCell?

Je ne veux pas dupliquer le code (ce que j'ai fait dans le passé), parce que je veux que l'utilisateur interagisse avec le popup comme il le ferait dans la cellule du tableau.

+0

N'essayez pas d'utiliser une cellule de vue de table en dehors d'une vue de table ... – matt

+0

@matt - pourquoi pas? Quel modèle dois-je utiliser, alors? Comment puis-je éviter de dupliquer tous les éléments de l'interface utilisateur et les interactions avec ces éléments? Je peux afficher le 'UITableViewCell' comme un popup tout seul très bien. Si je n'avais pas besoin de l'en-tête supplémentaire, je serais bien. Mais j'ai aussi besoin de l'en-tête. – thephatp

+0

Je ne sais pas ce que vous entendez par "interactions". Ce n'est pas la vue d'un contrôleur de vue, donc vous ne pouvez pas vous connecter à quoi que ce soit en dehors de celui-ci. Quoi qu'il en soit, si c'était moi, j'aurais une vue xib et ploperait sa vue dans la vue du contenu de la cellule et dans l'autre vue. – matt

Répondre

2

Je ne suis pas sûr de savoir comment vous convaincre de la façon dont cela est facile à faire sans chercher à abuser d'une cellule de vue de la table, alors voici une capture d'écran:

enter image description here

que vous venez de me croire quand je dis que c'est une table à trois rangs suivie d'une vue ordinaire totalement indépendante arrachée de l'intérieur de la cellule vue de la table (en chargeant la plume de la cellule). Ils n'ont pas seulement l'air identiques, ils agissent de façon identique; la vue est une sous-classe UIView personnalisée avec une méthode d'action du commutateur, et lorsque je clique sur le commutateur, elle déclenche cette méthode d'action, à la fois dans la table et dans la vue à l'extérieur.

La vue a été entièrement conçue dans la plume, et absolument aucun code n'a été répété.

Cela semble être le genre de chose que vous voulez faire. Donc, je vous encourage, ne pas abuser des cellules de vue de table; faites-le avec une vue ordinaire qui peut vivre heureux dans une cellule ou à l'extérieur.

+0

Si je construis cela via IB, est-il possible d'afficher la vue personnalisée lorsque j'ajoute cette vue personnalisée au prototype de cellule de vue de table dans IB? – thephatp

+0

C'est ce que j'ai fait. J'ai conçu la vue personnalisée dans la cellule. Je pense que je l'ai dit dans ma réponse ... et ça se voit. – matt

+0

Ce que je veux dire, c'est que je veux l'utiliser à deux endroits et le faire apparaître aux deux endroits dans IB, sans avoir à dupliquer. Tellement sûr, partout où je développe l'interface utilisateur, tout sera visible. Mais quand j'essaie d'ajouter cette nouvelle vue dans une autre vue, aucune des étiquettes ou des images ne sont là. Je peux assigner la classe 'MyCustomView' mais aucun des champs n'est dans IB dans cette nouvelle vue. – thephatp