【问题标题】:Show UIWebView inside Cocoa Touch Library在 Cocoa Touch 库中显示 UIWebView
【发布时间】: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

【问题讨论】:

    标签: ios objective-c cocoa-touch oauth uiwebview


    【解决方案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.
      }
      

      【讨论】:

        猜你喜欢
        • 2017-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-11
        • 1970-01-01
        • 2019-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多