Xcode 5 在带有 WebView 的新视图控制器中加载 URL
Posted
技术标签:
【中文标题】Xcode 5 在带有 WebView 的新视图控制器中加载 URL【英文标题】:Xcode 5 Loading a URL in a new View Controller with a WebView in it 【发布时间】:2013-10-09 16:17:46 【问题描述】:似乎早期版本的 Xcode 中的所有方法都不适合我。
我现在拥有的: 我有一个带有按钮的主菜单,该按钮可以进入另一个视图,其中包含一个带有 WebView 的不同控制器(有一个属性,因此可以设置要加载的 URL)
我想要什么: 当我从该按钮加载该视图时,我想将一个字符串从第一个视图传递到表示 URL 的新视图并将其加载到 Web 视图中。基本上我想要一个通用的 WebView 视图,它可以加载与它相关的视图传递的不同 URL。
这是 WebView H 文件的代码
#import <UIKit/UIKit.h>
@interface BRWebView : UIViewController
IBOutlet UIWebView *requestWebView;
@property (strong, nonatomic) NSString *loadUrl;
@end
在 MainMenu 的 ViewController 中有这个按钮监听器
-(IBAction)requestButton:(id)sender
BRWebView *web = [self.storyboard instantiateViewControllerWithIdentifier:@"BRWebView"];
web.loadUrl = @"Websitename.com";
[self presentModalViewController:web animated:YES];
在 BRWebView.m 文件中有这个
- (void)viewDidLoad
[super viewDidLoad];
NSURL *url = [NSURL URLWithString:_loadUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[requestWebView loadRequest:request];
【问题讨论】:
当然,我需要尽快上我的机器。 我添加一个答案,您需要设置好您的属性和您的第二个视图控制器的名称。 (我考虑为您的 URL 传递一个字符串,但您可以传递一个 URL 或其他)。 【参考方案1】:在问题中的代码后编辑:
在ViewController
中将您的代码替换为:
- (IBAction)requestButton:(id)sender
BRWebView *web = [self.storyboard instantiateViewControllerWithIdentifier:@"BRWebView"];
web.loadUrl = @"http://websitename.com";
[self presentViewController:web animated:YES completion:nil];
并在 BRWebView.m
中删除 viewDidLoad 中的代码并添加 viewWillAppear :
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
// URL Request Object
NSURLRequest *requestObj = [NSURLRequest requestWithURL:[NSURL URLWithString:_loadUrl]];
// Load the request in the UIWebView
[_requestWebView loadRequest:requestObj];
旧答案:
您需要使用这样的属性传递您的 URL 数据(没有导航控制器):
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier] isEqualToString:@"showDetail"])
// Get reference to the destination view controller
ViewControllerB *viewControllerB = segue.destinationViewController;
// Pass URL
viewControllerB.webviewURL = @"http://myurl.com";
带有导航控制器:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier] isEqualToString:@"showDetail"])
UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
ViewControllerB *viewControllerB = (ViewControllerB *)navController.topViewController;
// Pass URL
viewControllerB.webviewURL = @"http://myurl.com";
在您的第二次查看.h:
@property (nonatomic, strong) NSString *webviewURL;
第二次查看.m:
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
// URL Request Object
NSURLRequest *requestObj = [NSURLRequest requestWithURL:[NSURL URLWithString:_webviewURL]];
// Load the request in the UIWebView
[self.webView loadRequest:requestObj];
【讨论】:
ViewControllerB *viewControllerB = (ViewControllerB *)navController.topViewController;目前,不确定具体情况。 我将根据您的问题代码编辑我的答案 好的...显然我仍然在创建 BRWebView 对象时遇到崩溃。 "NSInvalidArgumentException" "Storyboard 不包含标识符为 BRWebView 的视图控制器" 尝试更改以请求 Web 视图。我似乎把所有东西都正确连接起来了,不知道出了什么问题 您需要在情节提要中添加BRWebView
作为您的视图的标识符
好的是的!谢谢你。现在还有一件事。如何让我的导航控制器显示在该页面的顶部?【参考方案2】:
您应该在对目标视图控制器执行 segue 之前设置 URL(NSString) 属性,并在“viewWillAppear”回调中加载请求:
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
if (self.loadUrl)
[self.requestWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.loadUrl]]];
【讨论】:
谢谢!这基本上就是我所需要的!【参考方案3】://网页视图的简单代码
- (void)viewDidLoad
[super viewDidLoad]; // self.myWebView.delegate=self;
NSString *urlString=@"http://www.google.com";
NSURL *url=[NSURL URLWithString:urlString];
NSURLRequest *obj=[NSURLRequest requestWithURL:url];
[self.myWebView loadRequest:obj]; // Do any additional setup after loading the view, typically from a nib.
【讨论】:
您能否在视觉上更好地格式化您的答案?以上是关于Xcode 5 在带有 WebView 的新视图控制器中加载 URL的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 在另一个 ViewController 中打开 WebView
使用 Xcode 5 Storyboards 构建带有原型表视图单元的动态表视图
带有 iOS 7 的 Xcode 5 中的 NSInternalInconsistencyException:“故事板:容器视图中有意外的子视图。”