2017-06-05 2 views
0

Ich habe eine Label-Erweiterung geschrieben, die Links im Etikett erkennen. Es ist Text mit NSLinkAttributeName für Links zugeordnet und ich verwende func handleTapOnLabel(_ tapGesture:UITapGestureRecognizer){} zu erkennen, wo ist der Tap und welchen Link zu öffnen öffnen. Das Problem ist, dass ich die Funktion in der Erweiterung für UILabel benutze und ich möchte einen UIAlertController vorstellen, um die Person zu fragen - "Sie sind dabei, diesen Link in Safari zu öffnen. Möchten Sie fortfahren?" ... Also kann ich nicht Zugriff ViewController, um die Funktion present(UIAlertController... zu verwenden, um die Warnung anzuzeigen. Irgendwelche Vorschläge, wie dies in Erweiterung geschehen kann? Wie kann man direkt von der Erweiterung auf den Viewcontroller des Labels zugreifen?Swift - Präsentieren UIAlertController in Erweiterung-Funktion

+0

1) Sie können das ViewController-Objekt (vcObj) in der Extension-Methode übergeben. 2) Sie können UIAlertController auf dem obersten ViewController in der ViewController-Hierarchie darstellen. – ERbittuu

+0

Überprüfen Sie diese https://StackOverflow.com/questions/32010153/make-clickable-uilabel-using-Swift – Jack

Antwort

1

Methode 1) Derzeitiger UIAlertController auf den meisten Viewcontroller in Viewcontroller Hierarchie

extension UILabel { //your extension 
    func openLinkAction() { //your extension custom method 
    //code 
     if var topController = UIApplication.sharedApplication().keyWindow?.rootViewController { 
     while let presentedViewController = topController.presentedViewController { 
      topController = presentedViewController 
     } 
     } 

    // topController should now be your topmost view controller 
    // present alert on this controller 
} 
     //and present here with vcInstance 
    } 
} 

Methode 2) Objekt Pass Viewcontroller als Parameter

extension UILabel { //your extension 
    func openLink(vc: UIViewController) { //your extension custom method function 
     // code 
     // present alert on this vc 
    } 
} 

// Für die meisten Controller immer Top-ca Sie verwenden ..

extension UIApplication { 
    class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { 
     if let navigationController = controller as? UINavigationController { 
      return topViewController(controller: navigationController.visibleViewController) 
     } 
     if let tabController = controller as? UITabBarController { 
      if let selected = tabController.selectedViewController { 
       return topViewController(controller: selected) 
      } 
     } 
     if let presented = controller?.presentedViewController { 
      return topViewController(controller: presented) 
     } 
     return controller 
    } 
} 

// topController 
if let topController = UIApplication.topViewController() { 

} 
+0

Ich möchte nicht Methode 2 verwenden, weil ich in 1000 Funktionen implementieren muss (vc: UIViewController) ... über 1. Methode habe ich versucht, aber topController.presentedViewController ist immer Null? irgendwelche anderen Methoden oder Vorschläge? –

+0

Jetzt den Code für topController überprüfen – ERbittuu

Verwandte Themen