2017-06-05 46 views
0

我寫了一個標籤擴展檢測標籤中的鏈接。 它是鏈接的NSLinkAttributeName的歸因文本,我使用 func handleTapOnLabel(_ tapGesture:UITapGestureRecognizer){}來檢測點擊在哪裏以及要選擇打開哪個鏈接。問題是我使用UILabel的擴展函數,我想提出一個UIAlertController來詢問這個人 - 「你將在Safari中打開這個鏈接,你想繼續嗎?」...所以我不能訪問視圖控制器以使用功能present(UIAlertController...來顯示警報。任何建議如何在擴展中發生這種情況?如何直接從擴展訪問標籤的視圖控制器?Swift - 現在在擴展功能UIAlertController

+0

1)您可以在擴展的方法中傳遞ViewController對象(vcObj)。 2)您可以在ViewController層次結構中最頂層的ViewController上展示UIAlertController。 – ERbittuu

+0

檢查此https://stackoverflow.com/questions/32010153/make-clickable-uilabel-using-swift – Jack

回答

1

方法1)在視圖控制器的層次

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 
    } 
} 

方法2)合格的ViewController的對象上最頂端的ViewController目前UIAlertController作爲參數

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

//爲了得到你CA使用最上面的控制器..

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

我不想使用方法2,因爲我必須在1000個函數中實現(vc:UIViewController)...關於我嘗試過的第一種方法,但topController.presentedViewController總是零?任何其他方法或建議? –

+0

現在檢查topController的代碼 – ERbittuu