2017-06-05 10 views
0

ラベル内のリンクを検出するラベル拡張を書きました。 リンク用のNSLinkAttributeNameが付いたテキストの属性です。私は func handleTapOnLabel(_ tapGesture:UITapGestureRecognizer){}を使用して、どこにタップがあり、どのリンクを開くかを検出しています。問題は、私がUILabelの拡張機能を使用していて、UIAlertControllerを提示してその人に尋ねるということです - 「Safariでこのリンクを開こうとしています。続行しますか?」 viewcontrollerにアクセスして、present(UIAlertController...ファンクションを使用してアラートを表示します。どのようにこれが延長で起こることができるか提案?どのように拡張子からラベルのviewcontrollerに直接アクセスするのですか?Swift - 現在の拡張関数UIAlertController

+0

1)拡張のメソッドでViewControllerオブジェクト(vcObj)を渡すことができます。 2)UIAlertControllerをViewControllerの階層の一番上のViewControllerに表示できます。 – ERbittuu

+0

これを確認してくださいhttps://stackoverflow.com/questions/32010153/make-clickable-uilabel-using-swift – Jack

答えて

1

方法1)使用するCA一番上のコントローラを取得するためのパラメータ

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

//などのViewControllerの階層

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

私はimplemet(vc:UIViewController)を1000の関数で使用する必要があるため、メソッド2を使用したくありません。私が試した1番目のメソッドについて、しかし、topController.presentedViewControllerは常にnilですか?他の方法や提案はありますか? –

+0

ここでtopControllerのチェックコード – ERbittuu

関連する問題