문제

터치 할 때 Safari에서 URL이 열리도록 UitextView에 DatadetectOrtypes를 지정했습니다.

대신 UIWebView에 URL을로드하도록이 동작을 가로 채는 것이 가능합니까? 아니면 이것을 다시 라우팅하기 위해 내 자신의 URL 검출기 코드를 작성했을까요?

도움이 되었습니까?

해결책

URL 감지를 직접 수행하고 URL이 탭 될 때 UIWebView를 수동으로로드해야합니다.

Apple이 모든 것을 보내기 때문에 모든 것이 맞춤형으로되어야합니다 http:// 그리고 https:// 사파리에 대한 URL 오프닝.

다른 팁

위의 가장 잘 작동하는 답은 [uiapplication openurl :]에 대한 메소드 구현을 대체하는 것입니다.

런타임을 사용하지 않고이를 달성하는 또 다른 방법은 uiapplication 서브 클래스입니다. 그런 다음 OpenUrl : Selector를 무시하십시오. 이 접근법을 사용하면 기본 처리를 원하는 URL에 대해 서브 클래스에서 [Super OpenUrl :]를 호출 할 수 있습니다. 또한 클래스의 내부 메소드 구현을 엉망으로 만들 필요가 없기 때문에 나에게 약간 더 깨끗해 보입니다.

그러나이 접근법을 선택하면 다른 두 가지 중요한 단계가 있습니다. main.m 파일에서는 서브 클래스의 이름과 일치하도록 세 번째 인수를 uiapplicationmain 함수 호출로 변경해야합니다.

int retVal = UIApplicationMain(argc, argv, @"MyApplicationSubclass", nil);

또한 MainWindow.xib 파일의 파일 소유자 클래스를 uiapplication에서 서브 클래스로 변경해야 할 것입니다.

나는 모든 사람에게 호의를 베풀고 블로그 게시물과 데모 앱으로 질문에 대답했습니다.

http://52apps.net/post/879106231/method-swizzling-uitextview-and-safari http://github.com/marksands/UITextViewLinkOptions

tt.kilew의 게시물을 확장하려면 카테고리를 생성하지만 방법을 다른 방법으로 호출하십시오. customOpenURL. Safari로 돌아가고 싶을 때 Method Swizzling이라는 무언가를합니다. 다음과 같이 보입니다.

#import <objc/runtime.h>
..
Method customOpenUrl = class_getInstanceMethod([UIApplication class], @selector(customOpenURL:));
Method openUrl = class_getInstanceMethod([UIApplication class], @selector(openURL:));
method_exchangeImplementations(customOpenUrl, openUrl);

이 메소드를 호출하여 교체하십시오 openURL 귀하와의 구현 customOpenURL Safari를 사용하고 싶지 않을 때 구현.

확인하십시오 데모 앱 자세한 내용은. 도움이 되었기를 바랍니다! :)

편집하다

앱이 거부 될 위험이 없다면 상황에 더 잘 맞기 위해 개발 한 사용자 정의 UitextView를 확인할 수 있습니다. 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이 열릴 때마다 호출해야합니다. 여기에서 웹 뷰에서 URL을 열 수 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top