Можно ли отправить хэш-тег на URL-адрес файла в UIWebView? - PullRequest
13 голосов
/ 25 мая 2011

Я хочу загрузить html-страницу из файла и добавить к ней хэш-тег.Возможно ли это?

Я пробовал

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];  
NSURL *fileUrl = [NSURL fileURLWithPath:[filePath stringByAppendingFormat:@"#hashtag"]];
[self.webView loadRequest:[NSURLRequest requestWithURL:fileUrl]];    
NSLog(@"fileUrl = %@, reachable? %d", fileUrl, [fileUrl checkResourceIsReachableAndReturnError:nil]);

, но пытается найти файл someFile.html%23hashtag, который не может быть найден.Есть ли способ добавить хеш после создания объекта NSURL?

Я также попытался загрузить файл в строку и использовать loadHTMLString:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];
NSString *fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:fileContents baseURL:[NSURL URLWithString:@"http://someFile.html#hashtag"]];

ЗдесьХэш-тег работает, но мои ссылки на JavaScript внутри HTML не работают.Следующим вопросом этого подхода было бы, как ссылаться на файлы javascript из html, загруженные в виде строки в UIWebView, т. Е. Каков базовый URL-адрес?поместите все мои файлы javascript в html и загрузите их как строку, но я думаю, что должен быть лучший способ!

Ответы [ 6 ]

25 голосов
/ 10 августа 2011

Я не пробовал это, но как насчет загрузки файла без хэштега и реализации UIWebViewDelegate с чем-то вроде этого?

- (void)webViewDidFinishLoad:(UIWebView *)webView {
   [webView stringByEvaluatingJavaScriptFromString:@"window.location.href = '#hashtag';"];
}

Ссылки:

10 голосов
/ 02 июня 2013

Что касается вопроса% 23, я не думаю, что решение Скотта Колерта о замене хорошо.

Следующие решения кажутся лучше, я просто скопировал его с здесь

NSURL *baseUrl = [NSURL fileURLWithPath:stringUrl];
NSURL *fullURL = [NSURL URLWithString:@"#jumpto" relativeToURL:baseUrl];

Немного не по теме, я нашел Safari на iOS 6.0, 6.1 ведет себя иначе, чем на iOS 5.1 и других браузерах для настольных компьютеров (включая Safari для OSX) в отношении обработки URL с привязкой. Для одного из моих конкретных документов, будь то в UIWebview или мобильном Safari на iOS 6.0 или 6.1, при первой загрузке страница не прокручивается в нужное положение, перезагрузка исправит это. Может быть, это как-то связано с тем, что часть html создается динамически javascript. Есть идеи?

2 голосов
/ 28 августа 2011

Вот как я это делаю в своем коде. Я добавляю хеш-метку к строке NSString, а затем превращаю ее в NSURL, используя fileURLWithPath. Затем я заменяю все экземпляры% 23 обратно на #. Все это объясняется в коде ниже, но дайте мне знать, если у вас есть какие-либо вопросы.

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];    
    NSString *filePathWithHash = [NSString stringWithFormat:@"%@#yourDesiredHashTagHere",filePath];
    NSURL *theURL = [NSURL fileURLWithPath:filePathWithHash];
    //NSURL turns the # into %23 when using fileURLWIthPath. So we need to change it back:
    NSString *finalURLString = [[NSString stringWithFormat:@"%@",theURL] stringByReplacingOccurrencesOfString:@"%23" withString:@"#"];
    //Then we need to change it back to an NSURL
    NSURL *finalURL = [NSURL URLWithString:finalURLString];
    //And finally we load this in the webView
    [theWebView loadRequest:[NSURLRequest requestWithURL:finalURL]];
1 голос
/ 02 сентября 2016

дополнение к ответу @ сян. Ниже быстрой версии, если вы работаете с локальными файлами HTML в вашем приложении:

let urlString = "relative/path/to/your/index.html"
let anchorString = "#your-anchor"
let baseURL:NSURL? = NSBundle.mainBundle().URLForResource(urlString, withExtension: nil, subdirectory: nil)
if let url:NSURL? = NSURL(string: anchorString, relativeToURL: baseURL) {
    // Do something with your URL
}
1 голос
/ 10 августа 2011

Вы должны иметь возможность перехватить NSURLRequest, привести его к NSMutableURLRequest, а затем изменить URL-адрес следующим образом.Все это произойдет в shouldStartLoadWithRequest.Убедитесь, что вы установили делегат UIWebView.

- (void) viewDidLoad
{
    self.webView.delegate = self;

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];  
    NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    //Make sure the request is mutable
    if(![request isKindOfClass:[NSMutableURLRequest class]])
        [NSException raise:@"Need to change the request, but can't" format:@""];

    NSMutableURLRequest* mutableRequest = (NSMutableURLRequest*)request;    
    NSString* newUrl = [NSString stringWithFormat:@"%@#hashtag", [[request URL] absoluteString]];
    [mutableRequest setURL:[NSURL URLWithString:newUrl]];    

    return YES;
}

Я не сталкивался ни с одним случаем, когда запрос не был изменяемым, но кто знает.

Или вы можете захотеть установить хеш в исходном URL (как вы делали), а затем заменить первое вхождение %23 на # в shouldStartLoadWithRequest.

0 голосов
/ 11 августа 2011

Я думаю, вам нужно добавить хеш после создания файла URL

Это работает, если вы измените

NSURL *fileUrl = [NSURL fileURLWithPath:[filePath stringByAppendingFormat:@"#hashtag"]];

что-то вроде:

NSString *urlString = [[NSURL fileURLWithPath:filePath] absoluteString];
NSURL *fileUrl = [NSURL URLWithString:[urlString stringByAppendingString:@"#hashtag"]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...