在 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的主要内容,如果未能解决你的问题,请参考以下文章

在 Cocoa Touch 中隐藏 UIImageView

Cocoa Touch:iPad 表格网格布局

Cocoa Touch,使用哪个:窗口模板还是视图模板?

Cocoa Touch - 处理被打断或丢失的触摸

Cocoa Touch 从 Core Data 更新 UITableView

Swift Cocoa Touch 自定义单元格为 IBOutlets 返回 nil