iPhone SDK - ウェブビューにUITextView内のリンクを開きます
-
19-09-2019 - |
質問
私はUITextViewでdataDetectorTypesを指定しています。
これは、私が代わりのUIWebViewにURLをロードするように、この動作を傍受することは可能ですか?それとも私は、この再ルーティングに私自身のURLの検出コードを記述しているのでしょうか?
解決
あなたはURLの検出を自分で行うと、手動でURLをタップしたときのUIWebViewをロードする必要があります。
すべてはAppleがSafariのにすべてhttp://
とhttps://
URL開口部を送信するためのカスタム・実行する必要があります。
他のヒント
それ以上の答えは最高の作品[のUIApplicationのOpenURL:]のためのメソッド実装の代替品です。
runtime.hを使用せずに、それを達成するもう一つの方法は、のUIApplicationのサブクラスを作成することです。セレクター:次に、OpenURLのを上書きします。このアプローチでは、[スーパーのOpenURL:]を呼び出すことができURLのサブクラスからデフォルトのために取り扱いたいです。また、あなたはクラスの内部メソッドの実装を台無しにする必要はありませんので、私には少しクリーナーようです。
あなたがこのアプローチを選択した場合は、、しかし、2つのその他の重要なステップがあります。それはあなたのサブクラスの名前と一致するようにmain.mファイルでは、UIApplicationMain関数呼び出しに第3引数を変更する必要があります:
int retVal = UIApplicationMain(argc, argv, @"MyApplicationSubclass", nil);
また、あなたはおそらく、あなたのサブクラスにのUIApplicationからあなたMainWindow.xibファイルにファイルの所有者のクラスを変更する必要があります。
私は皆に好意を行なったし、ブログ記事やデモのアプリで、あなたの質問に答えます。
http://52apps.net/post/879106231/method-swizzling-uitextview-and-safari
http://github.com/marksands/UITextViewLinkOptions
tt.Kilewのポストに拡張するには、カテゴリを作成するが、そのようなcustomOpenURL
など、他のあなたの方法の何かを呼び出します。あなたが戻ってサファリに行きたいときには、メソッドスウィズリングと呼ばれる何かをします。それはこのようになります:
#import <objc/runtime.h>
..
Method customOpenUrl = class_getInstanceMethod([UIApplication class], @selector(customOpenURL:));
Method openUrl = class_getInstanceMethod([UIApplication class], @selector(openURL:));
method_exchangeImplementations(customOpenUrl, openUrl);
Safariを使用しないでくださいとするとき、ちょうどあなたのopenURL
実装でcustomOpenURL
実装を交換するために、このメソッドを呼び出します。
詳細については、デモアプリケーションをチェックしてください。お役に立てれば! :)
編集
あなたが拒否されたばかりのアプリを危険にさらしたくない場合は、、あなたは私がより良い状況に合わせて開発されたUITextViewカスタムをチェックアウトする場合があります:<のhref =「https://github.com/marksands/MSTextView」 rel = "nofollowをさnoreferrer"> https://github.com/marksands/MSTextView の
私のために正常に動作しますもう一つの回答が:)にあるのUIApplicationのOpenURLを再実装:(NSURL *)URL
@interface UIApplication (Private)
- (BOOL)openURL:(NSURL*)url;
@end
@implementation UIApplication (Private)
- (BOOL)openURL:(NSURL*)url {
// all viewcontrollers should change currentViewController to self
if ([MyWatcher currentViewController]) {
// Do anything you want
[[MyWatcher handleURL:url withController:[MyWatcher currentViewController]];
return YES;
}
return NO;
}
@end
... Some view controller
- (void)viewDidLoad {
[super viewDidLoad];
[MyWatcher setCurrentController:self];
}
スウィフトバージョン:
あなたの標準UITextViewのセットアップは、デリゲートとdataDetectorTypesを忘れてはいけない、このようになるはずです。
var textView = UITextView(x: 10, y: 10, width: CardWidth - 20, height: placeholderHeight) //This is my custom initializer
textView.text = "dsfadsaf www.google.com"
textView.selectable = true
textView.dataDetectorTypes = UIDataDetectorTypes.Link
textView.delegate = self
addSubview(textView)
は、あなたのクラスは、この作品を追加し終了した後: あなたが最良のものである https://github.com/TransitApp/SVWebViewController にこのライブラリを、必要があることに注意してくださいそこに私の知る限ります。
class myVC: UIViewController {
//viewdidload and other stuff here
}
extension MainCard: UITextViewDelegate {
func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
//Do your stuff over here
var webViewController = SVModalWebViewController(URL: URL)
view.presentViewController(webViewController, animated: true, completion: nil)
return false
}
}
あなたはあなたのアプリケーションデリゲートでapplication:handleOpenURL:
を実装してみてください。
URLが開かれますたびに、このメソッドが呼び出されるはずです。ここでは、あなたのWebViewの中で開いているURLを作ることができる必要があります。