【发布时间】:2012-06-27 06:22:44
【问题描述】:
目前我仍在阅读NSTimer 的一些文档和教程。根据我目前的理解,我们调用计时器并给它一个方法,以便它会重复自己。然后我想到了一个想法。(我正在开发其他应用程序)
我打算做什么
- 实现
UIWebView - 在
UIWebView中实现NSTimer(可能是0.5sec),方法是检查UIWebView当前的url(绝对字符串),如果不是我指定的,它将重定向url。
我有我想要实现的代码,目的是纠正我对UIWebView 和NSTimer 的了解,并在我开始研究之前看看它是否合理。(我还在阅读文档。所以想了解更多并在开始工作之前尝试更多)
现在让我感到困惑的是,我的方法与NSTimer 兼容吗?在UIWebView viewDidLoad 方法中使用NSTimer 是否合理?由于应用程序每 0.5 秒不断运行该方法,是否会出现内存过载/崩溃?
例如NSTimer(如果我错了,请纠正我。但由于我希望它永远运行,只要用户在UIWebView 中,我将只需要此代码集而不包括@987654336 @)
NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 2.0
target: self
selector:@selector(onTick:)
userInfo: nil repeats:NO];
-(void)onTick:(NSTimer *)timer {
//do smth
}
EDIT2- @Robert Ryan,这是我正在使用的代码。(当我第一次更改此代码时,它现在才起作用)**(如果我屏蔽了 range2 部分,那么错误域 error-999 停止了。但是视图仍然没有加载)
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString *currentURL = [[request URL] absoluteString];
NSRange range1= [currentURL rangeOfString:@"news"];
NSRange range2= [currentURL rangeOfString:@"pdf"];
if (range1.location == NSNotFound)
{
NSURL *url = [NSURL URLWithString:@"http://www.imc.jhmi.edu/news.html"];
[webView loadRequest:[NSURLRequest requestWithURL:url]];
return NO; //no to this if its not found.
}
if(range2.location==NSNotFound)
{
NSURL * url = [NSURL URLWithString:@"http://www.imc.jhmi.edu/news.html"];
[webView loadRequest:[NSURLRequest requestWithURL:url]];
return NO; //no to this if its not found
}
return YES; //everything else ok
}
EDIT3 - 如果我将 NSRange range1 和 range2 组合成 1 个语句,那么它会再次工作(希望它在一个小时后仍然可以工作。xD)
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString *currentURL = [[request URL] absoluteString];
NSRange range1= [currentURL rangeOfString:@"news"];
NSRange range2= [currentURL rangeOfString:@"pdf"];
if (range1.location == NSNotFound & range2.location==NSNotFound)
{
NSURL *url = [NSURL URLWithString:@"http://www.imc.jhmi.edu/news.html"];
[webView loadRequest:[NSURLRequest requestWithURL:url]];
return NO;
}
return YES;
}
【问题讨论】:
-
可能不是不兼容,但似乎效率低下。你为什么想做这个?你想解决什么问题?您是否担心用户会点击您页面上的链接,从而使他们远离相关网址?还是您害怕网页本身可能会进行重定向?无论如何,与其做一个 NSTimer (或任何其他方式在未来触发一个方法),你会不会更好地使用 UIWebViewDelegate 方法
webViewDidFinishLoad:或webView:shouldStartLoadWithRequest:navigationType:? -
@RobertRyan - 我试过
webView:shouldStartLoadWithRequest:navigationType:但从其他人告诉我的情况来看,这只是为了开始(我假设它在加载页面后不起作用)。我要解决的是当人们在视图中停留一段时间(比如说 5 分钟),并且他们决定进入其他网址时,我想限制他们进入我指定的网址之外的其他网址。 -
不,这不仅适用于初始加载,还适用于通过该 UIWebView 进行的所有交互。它专为您所描述的内容而设计。比使用 NSTimer 或其他一些延迟方法调用进行轮询要好得多。试试
webView:shouldStartLoadWithRequest:navigationType。我想你会很高兴的。只需确保您设置了 webview 的委托(否则您可能不会收到消息)。 -
我已设置委托。我目前正在使用这种方法,但它对我不起作用。我已经发布了我当前使用该方法的代码。如果我启用/禁用 [webView reload] 它只是反冲,要么加载要么加载。
标签: objective-c ios uiwebview nstimer