2009-08-20 26 views
15

Tôi đang phát triển và ứng dụng iPhone 3.0. Và tôi đang cố mở các liên kết web trong một UITextView thành một UIWebView thay vì Safari. Nhưng vẫn không có may mắn.Làm cách nào để mở các liên kết web UITextView trong UIWebView thay vì Safari?

Không thể chỉnh sửa UITextView và phát hiện hoàn toàn liên kết web và mở chúng trong Safari.

Làm cách nào để tránh điều đó? Làm thế nào để lấy url đó để tôi có thể sử dụng với UIWebView của riêng tôi?

Trả lời

7

Cách đơn giản nhất là để ghi đè lên các phương pháp webView:decidePolicyForNavigationAction:request:frame:decisionListener: trên UITextView như vậy:

@interface UITextView (Override) 
@end 

@class WebView, WebFrame; 
@protocol WebPolicyDecisionListener; 

@implementation UITextView (Override) 

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id <WebPolicyDecisionListener>)listener 
{ 
    NSLog(@"request: %@", request); 
} 
@end 

này sẽ ảnh hưởng đến tất cả UITextView s trong ứng dụng của bạn. Nếu bạn chỉ yêu cầu điều này trên một khung nhìn duy nhất, hãy tạo một lớp con và ghi đè lên phương thức đó.

Lưu ý: đây là một API riêng tư về mặt kỹ thuật và có thể bị xóa bất kỳ lúc nào. Không có cách nào để thực hiện điều này thông qua API công khai.

chỉnh sửa: từ iOS 7.0 một phương pháp mới đã được giới thiệu trên UITextViewDelegate để hỗ trợ điều này. Xem câu trả lời của nihad để biết chi tiết.

+1

Uhm, là riêng, bạn có nghĩ nó sẽ là một vấn đề cho sự chấp thuận của Appstore? Btw tối nay tôi sẽ kiểm tra mã của bạn và tôi sẽ cho bạn biết. Cảm ơn. – crash

+0

Đây không phải là thứ mà họ có thể kiểm tra, nhưng bạn có thể có nguy cơ thay đổi hệ điều hành trong tương lai (đây là API công khai trong tương đương với máy tính và không chắc Apple sẽ ngừng sử dụng WebKit, nhưng có thể) . Điều tồi tệ nhất có thể xảy ra là hành vi sẽ trở lại mặc định khi khởi chạy MobileSafari. – rpetrich

+0

Hoàn hảo. Nó hoạt động trơn tru. Cảm ơn! – crash

20

Đây là câu hỏi cũ nhưng trong trường hợp bất kỳ ai đang tìm kiếm cách cập nhật để thực hiện việc này.

Gán viewController của bạn chứa UITextView như một đại biểu trong file .m viewController của bạn và chỉ cần thêm:

-(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange{ 

    //Do something with the URL 
    NSLog(@"%@", URL); 


    return NO; 
} 
+0

Tôi tin rằng đây là cách thích hợp của iOS 7. Điều này đã giúp tôi, vì vậy cảm ơn bạn! – ajfigueroa

+0

@nihad Cảm ơn rất nhiều điều này có vẻ sạch hơn và dễ dàng hơn so với giải pháp cũ hơn. – sunny

2

Với Swift 3, UITextViewDelegate cung cấp một phương pháp textView(_:shouldInteractWith:in:interaction:). textView(_:shouldInteractWith:in:interaction:) có tuyên bố sau:

Yêu cầu đại biểu nếu chế độ xem văn bản được chỉ định sẽ cho phép loại người dùng được chỉ định tương tác với URL đã cho trong phạm vi văn bản nhất định.

optional func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool 

Các mã sau đây cho thấy làm thế nào để mở UITextView liên kết web trong một SFSafariViewController thay vì mở chúng trong Safari ứng dụng:

import UIKit 
import SafariServices 

class ViewController: UIViewController, UITextViewDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Set textView 
     let textView = UITextView() 
     textView.text = "http://www.yahoo.fr http://www.google.fr" 
     textView.isUserInteractionEnabled = true 
     textView.isEditable = false 
     textView.isSelectable = true 
     textView.dataDetectorTypes = UIDataDetectorTypes.link 

     // Add view controller as the textView's delegate 
     textView.delegate = self 

     // auto layout 
     view.addSubview(textView) 
     textView.translatesAutoresizingMaskIntoConstraints = false 
     textView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
     textView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
     textView.heightAnchor.constraint(equalToConstant: 300).isActive = true 
     textView.widthAnchor.constraint(equalToConstant: 300).isActive = true 
    } 

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { 
     // Open links with a SFSafariViewController instance and return false to prevent the system to open Safari app 
     let safariViewController = SFSafariViewController(url: URL) 
     present(safariViewController, animated: true, completion: nil) 

     return false 
    } 

} 
Các vấn đề liên quan