2009-10-12 35 views
5

Trong ứng dụng iPhone của tôi, UITextView chứa URL. Tôi muốn mở URL này trong một UIWebView thay vì mở nó vào safari? UITextView của tôi chứa một số dữ liệu cùng với một URL. Trong một số trường hợp, không. URL có thể nhiều hơn một URL.Cách mở URL UITextView trong Giao diện người dùng Web?

Cảm ơn Sandy

Trả lời

3

Giả sử bạn có các trường hợp sau đây, mà cũng được bổ sung vào UIView của bạn:

UITextView *textView; 
UIWebView *webView; 

và TextView chứa chuỗi URL, bạn có thể tải các nội dung của URL vào WebView , như sau:

NSURL *url = [NSURL URLWithString:textView.text]; 
NSURLRequest *req = [NSURLRequest requestWithURL:url]; 
[webView loadRequest:req]; 
+0

Cảm ơn phản ứng pythonquick nhưng tôi đang đối mặt với một tình huống khác trong trường hợp của tôi UITextView có chứa một số dữ liệu văn bản cùng với một URL trong một số trường hợp số lượng URL có thể nhiều hơn một. – sandy

+0

OK, vì vậy nếu bạn có nhiều hơn một URL trong văn bản của UITextView, điều gì sẽ xảy ra với UIWebView? Trong trường hợp nào thì UIWebView sẽ tải URL nào? – pythonquick

9

UITextView có khả năng phát hiện URL và siêu liên kết nhúng cho phù hợp. Bạn có thể bật tùy chọn đó ở:

myTextView.dataDetectorTypes = UIDataDetectorTypeLink; 

Sau đó, bạn cần định cấu hình ứng dụng của mình để bẫy yêu cầu URL này và để ứng dụng của bạn xử lý yêu cầu đó. Tôi đã xuất bản một lớp soạn sẵn trên github thực hiện điều này, có thể là tuyến đường dễ nhất: http://github.com/nbuggia/Browser-View-Controller--iPhone-.

Bước đầu tiên là phân loại UIApplication phụ để bạn có thể ghi đè người sẽ thực hiện hành động theo yêu cầu 'openUrl'. Đây là những gì lớp mà có thể trông giống như:

#import <UIKit/UIKit.h> 
#import "MyAppDelegate.h" 

@interface MyApplication : UIApplication 

-(BOOL)openURL:(NSURL *)url; 

@end 


@implementation MyApplication 

-(BOOL)openURL:(NSURL *)url 
{ 
    BOOL couldWeOpenUrl = NO; 

    NSString* scheme = [url.scheme lowercaseString]; 
    if([scheme compare:@"http"] == NSOrderedSame 
     || [scheme compare:@"https"] == NSOrderedSame) 
    { 
     // TODO - Update the cast below with the name of your AppDelegate 
     couldWeOpenUrl = [(MyAppDelegate*)self.delegate openURL:url]; 
    } 

    if(!couldWeOpenUrl) 
    { 
     return [super openURL:url]; 
    } 
    else 
    { 
     return YES; 
    } 
} 


@end 

Tiếp theo, bạn cần cập nhật main.m để xác định MyApplication.h như là các đại biểu bonified cho lớp UIApplication của bạn. Mở main.m và thay đổi dòng này:

int retVal = UIApplicationMain(argc, argv, nil, nil); 

này

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

Cuối cùng, bạn cần phải thực hiện các [(MyAppDelegate *) openURL: url] phương pháp để có nó làm những gì mà bạn sẽ giống như với URL. Giống như có thể mở một bộ điều khiển xem mới với một UIWebView trong nó, và hiển thị URL. Bạn có thể làm một cái gì đó như thế này:

- (BOOL)openURL:(NSURL*)url 
{ 
    BrowserViewController *bvc = [[BrowserViewController alloc] initWithUrls:url]; 
    [self.navigationController pushViewController:bvc animated:YES]; 
    [bvc release]; 

    return YES; 
} 

Hy vọng điều đó sẽ phù hợp với bạn.

+0

rất chi tiết. Sẽ cố gắng. Cảm ơn rất nhiều –

+0

Thực sự hữu ích, cảm ơn. Nhưng làm cách nào bạn có thể quản lý các chế độ xem khác nhau khi triển khai siêu liên kết? Ý tôi là, trong ví dụ của bạn, trong AppDelegate bạn thực hiện: 'BrowserViewController * bvc = [[BrowserViewController alloc] initWithUrls: url]; [self.navigationController pushViewController: bvc hoạt ảnh: YES]; ' vì chỉ có một chế độ xem. Nhưng nếu bạn gọi phương thức 'openURL' từ các chế độ xem khác nhau trong ứng dụng thì sao ??? – yassassin

+0

@yassassin - phạm vi của AppDelegate là cho toàn bộ ứng dụng, do đó, ghi đè sẽ có sẵn ở khắp mọi nơi. Có một quá tải cho phương pháp cho phép bạn ghi đè hành vi này nếu bạn vẫn muốn có thể mở một số liên kết trong safari: 'forceOpenInSafari: (BOOL) forceOpenInSafari'. –

10

Bạn có thể làm theo các bước sau:

  1. Tick vào các thuộc tính sau trong UITextView lấy từ xib hoặc Storyboard.

Check these properties of UITextView

HOẶC viết này cho TextView chụp tự động.

textview.delegate=self; 
textview.selectable=YES; 
textView.dataDetectorTypes = UIDataDetectorTypeLink; 
  1. Bây giờ viết dưới đây delegate phương pháp:
-(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange 
{ 
NSLog(@"URL: %@", URL); 
//You can do anything with the URL here (like open in other web view). 
    return NO; 
} 

Tôi nghĩ rằng bạn đang tìm kiếm cho điều đó.

+0

Oh Man bạn thật tuyệt vời bạn đã cứu ngày của tôi – Mashhadi

+0

Điều tuyệt nhất! Cảm ơn bạn – brbgyn

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