在 Cocoa Touch 库中显示 UIWebView
Posted
技术标签:
【中文标题】在 Cocoa Touch 库中显示 UIWebView【英文标题】:Show UIWebView inside Cocoa Touch Library 【发布时间】:2013-03-01 09:42:25 【问题描述】:我在一个新的 Cocoa Touch 库中工作,我需要以编程方式显示 UIWebView,因为我要在外部网络中请求用户和密码(如 oAuth),但我不知道如何在内部执行此操作一个 Cocoa Touch 库。
示例代码:
Client.h
#import <Foundation/Foundation.h>
@interface Client : NSObject
@property NSString *_aProperty;
- (void)showUIWebView:(NSURL*)urlToOpen;
@end
Client.m
#import "Client.h"
@implementation Client
@synthesize _identity;
- (void)showUIWebView:(NSURL*)urlToOpen
// I need to write code here to show the UIWebView :)
@end
【问题讨论】:
【参考方案1】:我可以使用这样的代码做到这一点:
UIApplication *app = [UIApplication sharedApplication];
UIWebView *web = [[UIWebView alloc] initWithFrame: CGRectMake(10, 40, 300, 300)];
NSURLRequest *req = [NSURLRequest requestWithURL: [NSURL URLWithString: @"http://yahoo.com"]];
[web loadRequest: req];
[app.keyWindow addSubview: web];
所以主要思想是将您的视图作为子视图添加到应用程序的 keyWindow。
【讨论】:
一个问题,UIWebView的委托方法在哪里执行?UIApplication *app = [UIApplication sharedApplication];
这是App的根吗?
你没有问过代表的问题 :) 让我想想
UIApplication 是一个主单例,因此您可以从应用程序的任何部分访问它。
关于委托:您的客户端必须是 UIWebView 的委托,因为您的库的用户不知道您将要展示的 UIWebView 的详细信息。如果您需要通知用户,您可以创建自己的协议并为您的客户提供委托【参考方案2】:
就我而言,您只能在 UIViewControllers
内显示 Cocoa-Touch 中的 UI 元素 - 这似乎很合乎逻辑。
在您的NSObject
中的方法内,您可以通过创建对它的引用来触发另一个UIViewController
中的方法,然后此时将其添加到您的UIView
:
- (void)showUIWebView:(NSURL*)urlToOpen
UIViewController *myVC = [self.navigationController.viewControllers lastObject];
//This is your last view in the navigationController hierarchy.
UIWebView *newWebView = [[UIWebView alloc] initWithFrame:myVC.view.frame];
[myVC.view addSubview:newWebView];
或者你可以从另一个你引用这个库的ViewController
触发它。
【讨论】:
我喜欢这个部分:UIViewController *myVC = [self.navigationController.viewControllers lastObject];
我明天试试:)
如果你有一个 UINavigationController
并且你想要访问的视图是视图层次结构中的最后一个(基本上是 99% 的时间),它将起作用。【参考方案3】:
我认为最简单的方法是让应用程序调用您的库提供一个超级视图,然后您可以将子视图添加到其中:
@interface ChemitaxisLibrary
typedef void (^ChemitaxisLibraryLoginCompletionBlock)(BOOL loggedIn);
- (void)loginWithinSuperview:(UIView*)superView completion:(ChemitaxisLibraryLoginCompletionBlock)completion;
@end
这将要求您的代码用户在他们的应用中提供他们愿意允许您放置 UIWebView* 实例的位置。
(带有指示成功或失败的 BOOL 的完成块允许您的库根据需要操作 webview,当您到达可以报告成功或失败的地方时,完成句柄将为您提供一种方法这样做。)
一旦你有了这个,在他们传递的超级视图中添加你的 UIWebView 可以像你想要的那样简单或复杂。你可以接管整个框架,或者你可以占据一个角落,或者你可以是动态的,并根据他们给你的 superView 的大小来决定做什么。
【讨论】:
【参考方案4】:你应该这样做。
您必须将 Frame 替换为与您添加到的视图相对应的 Web 视图的 x、y、宽度、高度,并将 self.view 替换为存储父视图的变量。
例如,如果您想将其添加到根视图(窗口),您可以将 self.view 替换为 [[UIApplication sharedApplication] keyWindow]。
- (void)showUIWebView:(NSURL*)urlToOpen
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)]; // WebView Location & Dimensions
[webView loadRequest:[NSUrlRequest requestWithURL:urlToOpen]];
[self.view addSubView:webView]; // Where self.view is the view you wish to add the Web View to.
【讨论】:
以上是关于在 Cocoa Touch 库中显示 UIWebView的主要内容,如果未能解决你的问题,请参考以下文章