2017-07-13 9 views
0

Amoureux,NSButton avec popover par programme

J'ai une question concernant la création de bouton dynamique avec popovers. Tout d'abord permettez-moi de vous montrer une version storyboard d'un PoC pour démontrer ce que je veux faire:

enter image description here

Si j'appuie sur le bouton, le nouveau ViewController montrent jusqu'à sur le bouton qui est pressé:

enter image description here

Ok jusqu'à maintenant. C'est la tâche. Mais maintenant je dois ajouter les boutons par programme et les ajouter dans un stackView.

Le code prototype:

class ViewController: NSViewController { 

    @IBOutlet weak var stackView: NSStackView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     for i in (1...5) { 
      addButton(i) 
     } 
    } 

    func addButton(_ i: Int){ 
     let button = NSButton(title: "TAG Button \(i)", target: nil,  action: nil) 
     stackView.addArrangedSubview(button) 
    } 

} 

Il semble bon:

enter image description here

Ma question est: comment voulez-vous faire le popover sur chaque bouton. Dois-je l'ajouter par programmation, ou devrais-je utiliser une sorte de Storyboard et réutiliser une vue? Comment résoudriez-vous le problème que c'est beau et lisse et refactorisable?

Si vous avez une minute, pouvez-vous s'il vous plaît envisager le pour et le contre avec une courte introduction comment l'implémenter?

Les boutons que j'ajouteront seront des étiquettes que je dois rendre cliquables pour plus d'informations et d'actions.

Merci beaucoup!

+++++ ++++ MISE À JOUR

J'ai fait le contrôleur de vue automatique en SB. Mon bouton a une cible de clic et appelle une fonction. C'est très bien et les coutures sont très utilisables. Mais comment puis-je voir la popup du bouton?

@objc func click(_ sender: NSButton?){ 
    let sb = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil) 
    if let vc: NSViewController = sb.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("TagPopupViewController")) as? NSViewController { 

     // how to set the vc as popover over the button? 
    } 
} 

sender n'a pas de presentViewController fonction.

+0

Qu'avez-vous essayé? Est-ce que tous les boutons devraient montrer le même popover? Je voudrais définir l'action des boutons, sinon ils ne fonctionnent pas. Dans l'action, je voudrais charger un VC du storyboard et le présenter comme popover. – Willeke

+0

Les boutons montrant le texte et j'ai besoin d'un menu contextuel dans le VC. Tous les popovers afficheront la même interface utilisateur et devraient agir (comme, déplacer, dupliquer, supprimer) sur la balise sélectionnée. –

+0

J'ai mis à jour la question ci-dessus. J'ai une fonction de clic qui est déclenchée par les boutons. Mais comment présenter le contrôleur de vue en tant que segue popover? –

Répondre

0

Ah, ok, je peux utiliser : presentViewController (vc, asPopoverRelativeTo: (expéditeur .bounds) !, de: expéditeur !, preferredEdge: NSRectEdge.maxX, comportement: NSPopover.Behavior.transient)

donc tout le code:

class ViewController: NSViewController { 

@IBOutlet weak var stackView: NSStackView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    for i in (1...5) { 
     addButton(i) 
    } 
} 

func addButton(_ i: Int){ 
    let button = NSButton(title: "TAG Button \(i)", target: nil, action: nil) 
    button.target = self 
    button.action = #selector(self.click) 
    stackView.addArrangedSubview(button) 

} 

@objc func click(_ sender: NSButton?){ 
    let sb = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil) 
    if let vc: NSViewController = sb.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("TagPopupViewController")) as? NSViewController { 

     presentViewController(vc, asPopoverRelativeTo: (sender?.bounds)!, of: sender!, preferredEdge: NSRectEdge.maxX, behavior: NSPopover.Behavior.transient) 
    } 
} 

} 

Merci

Qu'est-ce que Willeke !.