使 WebView 在 iOS 中跳转
Posted
技术标签:
【中文标题】使 WebView 在 iOS 中跳转【英文标题】:make the WebView jump in iOS 【发布时间】:2014-07-26 11:52:27 【问题描述】:我是 ios 开发新手。我的项目需要我创建一个带有左侧滑动抽屉的应用程序,它应该控制主视图,里面有一个 web 视图。
为了让它们相互交流,我创建了一个 KKYViewController 的委托。
@protocol KKYViewControllerDelegate <UIWebViewDelegate>
@end
@interface KKYViewController : UIViewController <UIWebViewDelegate,UIApplicationDelegate>
id<KKYViewControllerDelegate> _delegate;
@property (nonatomic, strong) id delegate;
@property (nonatomic, retain)UIWebView* webView;
- (void)handleRefresh:(UIWebView *)webView;
@end
这是我的主视图控制器KKYViewController.m
@implementation KKYViewController
@synthesize webView = _webView;
- (void)viewWillAppear:(BOOL)animated
self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
self.webView.delegate = self;
[self.view addSubview:_webView];
[self loadExamplePage:_webView url:@"http://www.google.com"];
- (void)loadExamplePage:(UIWebView*)webView url:(NSString*)strURL
NSURL *url = [NSURL URLWithString:strURL];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
[webView loadRequest:urlRequest];
NSLog(@"LoadExamplePage!");
- (void)handleRefresh:(UIWebView *)webView
NSString* strURL = @"http://www.github.com";
NSURL *url = [NSURL URLWithString:strURL];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:urlRequest];
NSString *theTitle=[self.webView stringByEvaluatingjavascriptFromString:@"document.title"];
NSLog(@"title:%@",theTitle);
NSLog(@"ReloadPage!");
到目前为止,它运行良好,web 视图看起来很棒。然后我想使用另一个控制器的委托 KKYLeftSideDrawerControoler。这是一个表格,我想触摸其中一行以使 webview 跳转~ ~~
#import "KKYViewController.h"
@interface KKYLeftSideDrawerViewController : UIViewController <UITableViewDelegate,UITableViewDataSource,KKYViewControllerDelegate>
@end
然后是KKYLeftSideDrawerController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
KKYViewController* webViewDelegate = [[KKYViewController alloc] init];
webViewDelegate.delegate = self;
switch (indexPath.row)
case 0:
UIAlertView* myAlert = [[UIAlertView alloc] initWithTitle:@"Login Successed!" message:@"~~~~" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK",nil];
[myAlert show];
break;
case 1: //Here I wanna use this to reload my webview to new url!
[webViewDelegate handleRefresh:webViewDelegate.webView];
NSLog(@"tend to reload");
break;
case 2:
break;
case 3:
break;
好吧,委托工作是因为当我按下 case 1 行时,我的控制台将记录我将它们放在 *- (void)handleRefresh:(UIWebView ) 中的信息网络视图。
问题来了:在-(void)handleRefresh中,我发现webview没有跳转,如你所见,我尝试记录它的标题,但结果为null~
我跟踪日志并发现我在 - (void)handleRefresh 中引用的 webView 是 nil。我曾经认为它与我在 *- (void)viewWillAppear 中加载的 webView 相同:(BOOL)动画 *.
这让我发疯了很长一段时间,只需要你的帮助,我会很感激的。
【问题讨论】:
如果您刚接触 iOS 1 周,请不要深入研究此类问题。你甚至还没有弄清楚基本的内存管理。 你说得对,所以我要去了解更多。但我想要一个解决方案,我也可以从中学到一些。有一天我回到这个可能会给我更多的帮助这个。谢谢! 【参考方案1】:首先你要知道[webView loadRequest:urlRequest]是一个异步调用,也就是说方法返回before(!!)实际工作完成。
所以在调用“loadRequest:”之后,页面既没有加载,也不能指望已经获得页面的标题(所以你的“handleRefresh:”方法一定不能工作)。
至少你需要实现 UIWebView 委托方法“webViewDidFinishLoad:”,当 webView 完成页面加载时,由 webView 对象调用。如果调用了“webViewDidFinishLoad:”,那么你可以访问文档的标题并确保它是有效的。
同样在您的方法“tableView:didSelectRowAtIndexPath:”中,每次用户在表格单元格上进行选择时,您都会创建一个新的 KKYViewController 对象。但是您永远不会将此视图控制器添加到应用程序的控制器层次结构中。因此它永远不会插入到您的应用程序的视图层次结构,因此永远不会调用“viewDidAppear”方法。因此永远不会创建 webView(因此为零)。
另外一句话:
我会避免创建新的视图对象(在您的情况下为 UIWebView)并将它们添加到视图控制器的“viewWillAppear:”方法中的视图层次结构中。只要视图变得可见,就会调用此方法,如果这个视图控制器在导航控制器中被推入和推出,视图控制器可以很容易地多次可见和隐藏,而控制器本身只创建一次。所以你最终可能会创建多个 UIWebView 对象,但你只想创建一个。因此,通常最好在视图控制器的“loadView”(以编程方式创建视图层次结构)或“didLoadView”(从 NIB/XIB 文件加载视图层次结构)方法中创建或自定义视图层次结构.
我建议您从一些基础知识开始:您需要了解视图控制器的工作原理以及它们如何交互。开始玩 UINavigationController 并学习如何推拉其他视图控制器,查看方法“loadView”、“viewDidLoad”、“viewWillAppear:”、“viewDidAppear:”、“viewWillDisappear:”等,并了解何时调用这些方法.
【讨论】:
非常感谢!实际上我确实回去复习了一些基础知识然后已经解决了它,但是您的回答恰到好处。无论如何谢谢!以上是关于使 WebView 在 iOS 中跳转的主要内容,如果未能解决你的问题,请参考以下文章
iOS 获取appStore的链接地址,从app中跳转 appStore中应用
H5页面在IOS微信中跳转时,会出现底部工具栏,遮挡页面底部内容