textSelection : personnaliser le contenu (Swift/swiftUI)

Bonjour,
Lorsque que l’on sélectionne un texte, les options copier/coller/partager apparaissent mais je voudrais le personnaliser en y ajoutant des elements comme par exemple « signaler une faute » et « commenter » avec swift/swifUI.

Je ne trouve rien sur internet à ce sujet.

Merci de votre aide.

J’ai regardé vite fait, intrigué par ton sujet, et, compte tenu de mon petit niveau, je n’ai pas trouvé ; je crains que ce ne soit pas très facile, car le menu en question est donné par le système lui-même, l’étendre ne doit pas être ni très encouragé, ni très facile. Mais je suppose que tu peux conjuguer l’action d’un bouton avec une TextSelection pour proposer l’une ou l’autre action spécifique ? Si tu trouves un procédé pour étendre un menu système, et qui soit régulier, peux-tu nous en faire part ?

merci @fjacquemin pour ta réponse.

je sais que c’est possible de le faire car je l’ai vu plusiuers fois mais je pourrais pas dire si c’était en swift/swifui.

Il s’agit d’une webview (pour le texte des articles), donc c’est vraiment sur ce popu que j’ai besoin d’agir.

Bonjour,

J’ai trouvé ça, j’espère que ça peut répondre à ton besoin ?

Cordialement,
Nicolas

Ah, ben, voilà qui clot la question, et démontre que j’avais tout à fait tort ! Bravo.

Merci @ristretto pour le bout de code. Cependant il n’est pas compatible avec SwifUi.

Une partie du code fonctionne (CustomWKWebView qui permet de garder seulement Couper/Copier/coller) mais pas l’autre qui permet d’ajouter les elements que l’on veut. Quelqu’un pourrait m’aider pour rendre compatible SwiftUI la class MyViewController pour que du coup elle puisse se lancer au chargement de la vue

class CustomWKWebView: WKWebView {

        override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
            switch (action) {
            case #selector(cut(_:)), #selector(copy(_:)), #selector(paste(_:)):
                return super.canPerformAction(action, withSender: sender)
            default:
                return false
            }
        }
    
    override func cut(_ sender: Any?) {
        super.cut(sender)
        print("on cut")
    }
    
    override func copy(_ sender: Any?) {
        super.copy(sender)
        print("on copy")
    }
    
    override func paste(_ sender: Any?) {
        super.paste(sender)
        print("on paste")
    }

}

class MyViewController: UIViewController {
    
    var webView: CustomWKWebView!
    
    override func loadView() {
        webView = CustomWKWebView(frame: .zero)
        self.view = webView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let path = Bundle.main.path(forResource: "example2", ofType: "html")
        let url = URL(fileURLWithPath: path!)
        let request = URLRequest(url: url)
        webView.load(request)
        
        addCustomContextMenu()
    }

    func addCustomContextMenu() {
        let special1 = UIMenuItem(title: "Special 1", action: #selector(special))
        let special2 = UIMenuItem(title: "Special 2", action: #selector(special))
        UIMenuController.shared.menuItems = [special1, special2]
    }
    
    @objc func special() {
        print("special")
    }
    
}

Merci d’avance

Alors là, pour une fois, je sais. C’est dans le cours de Maxime.

Le bout de code en question utilise un view controller de UIKit, UIViewController, et, justement, tu peux te servir d’une procédure particulière pour utiliser ça depuis SwiftUI. Dans la doc officielle d’Apple, tu cherches SwiftUI, qui dans la doc SwiftUI, tu cherches « framework integration », et tu trouveras « UIViewControllerRepresentable » : A view that represents a UIKit view controller, pour utiliser dans une vue de SwiftUI un view Controller de UIKit.

Il y a un cours dans lequel Maxime nous montre comment l’utiliser, ainsi d’ailleurs que l’inverse, « UIHostingController » pour intégrer une vue SwiftUI dans une app basée sur UIKit.

Merci.
Il s 'agit d’un view WKwebview dans laquelle je charge du CSS et du HTML
Mon niveau n’est pas assez avancé pour arriver à faire la conversion.

Je t’assure que si tu le fais, après, tu trouveras que ton niveau est assez avancé. Il y a un cours dans lequel Maxime le montre, je crois que c’est dans un cours sur les nouveautés de iOS 13 Swift 5 chapitre 2.6, il y a deux ou trois cours là-dessus.
Rien de ce qu’un codeur fait n’est hors de portée. Le tout, c’est de prendre son courage à deux mains et de se convaincre d’essayer. Et si ça ne marche pas du premier coup, on essaie de comprendre pourquoi, et on finit toujours par y arriver. Et si en route, tu cales, reviens le dire ici, il y a des gens beaucoup plus forts que moi qui te dépannerons avec plaisir !

D’accord je vais essayer merci