【问题标题】:Same WebView on every view每个视图都使用相同的 WebView
【发布时间】:2010-12-15 19:59:07
【问题描述】:

基本上我在SecondViewController 上有一个WebView,我希望WebView 像标签栏一样在每个视图上可见,并且在每个视图上完全可控。

请注意WebView 将在带有在线幻灯片的网页上,因此我不能简单地在每个视图上重新加载

SecondViewController我也有

- (void)webViewDidFinishLoad:(UIWebView *)YouTubePlayer {

【问题讨论】:

    标签: iphone objective-c uiwebview


    【解决方案1】:

    我建议在您添加tabbarcontroller.view 之后在您的窗口上添加webView,就像:

    [window addSubview:tabbarController.view];
    [window addSubview:webview];
    [window makeKeyAndVisible];
    

    并且最初 make 不要让它可见。您应该在应用程序委托中处理所有与 webview 相关的方法。现在,当您不需要它时,您可以通过从视图控制器调用您在应用程序委托中编写的方法来隐藏它。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我只是设置了一个单例 UIWebView 并在该视图控制器即将变得可见时将其添加到每个视图控制器视图中。这是一种方法:

      //.h
      
      @interface SharedWebView : UIWebView
      {
      }
      
      + (SharedWebView*) shared;
      
      @end
      
      //.m
      
      SharedWebView* g_sharedWebView;
      
      @implementation SharedWebView
      
      
      + (SharedWebView*) shared 
      {
          if ( g_sharedWebView == nil )
          {
              g_sharedWebView = [[SharedWebView alloc] init];
      
              // ... any other intialization you want to do
          }
      
          return g_sharedWebView;
      }
      
      @end
      
      
      // in your view controller(s)
      
      @property (readonly) UIWebView* webView
      
      - (UIWebView*) webView
      {
          return [SharedWebView shared];
      }
      
      - (void) viewWillAppear: (BOOL) animated
      {
          [super viewWillAppear: animated];
      
          [self.view addSubview: self.webView ];
          self.webView.frame = CGRectMake(10, 10, 300, 300);
      
          // want to re-set the delegate?
          // self.webView.delegate = self;
      }
      

      【讨论】:

      • 我收到一个错误 - (UIWebView*) webView { return [SharedWebView shared]; } 在 .h
      【解决方案3】:

      最简单的方法是让所有视图控制器都知道这个额外的视图(通过单例 PinnedViewController 或其他方式使视图可用)。在每个视图控制器的-viewWillAppear 期间,只需这样做:

      [self addSubview:[[PinnedViewController sharedController] view]];
      

      这会将视图移动到当前处于活动状态的任何人(使视图成为您的子视图会自动将您从旧层次结构中删除)。

      如果这很麻烦或不可行,还有其他两种选择。首先,您可以将UITabViewController 子类化(我假设这就是您在此处使用的问题),并注入您的额外视图(调整内容视图的大小以腾出空间)。这是未记录且不受支持的,因此请注意。但是,如果您不做太多其他花哨的技巧,这并不是非常困难的。

      另一个棘手的解决方案是创建第二个UIWindow,将其浮动在主UIWindow 上(或调整主UIWindow 的大小以为其腾出空间)。这只是半记录的,也没有真正支持。但是,如果您尝试将额外的视图放在标签栏下方,这种方法可以工作。

      但如果您的系统足够简单,我建议您只让视图控制器手动管理固定视图。通过这种方式,您将节省大量代码,并且您不必依赖任何未记录的内部视图层次结构。

      【讨论】:

        【解决方案4】:

        听起来您尝试将视图放在此视图之上,而不是模态视图。我曾经看过这篇博客文章,描述了你将如何做这样的事情。我认为它也应该适用于您的情况:semi-modal-transparent-dialogs-on-the-iphone

        【讨论】:

        • 如果这有影响,我会在视图上使用选项卡
        【解决方案5】:

        在 iOS 中,UIViewController 需要管理整个“屏幕”内容,因此尝试在多个视图控制器之间共享单个视图是不正常的。试图让 UIViewControllers 的视图只管理其窗口的一部分是有问题的,并且会导致意外的行为,因为 UIKit 不会向所有具有可见视图的视图控制器发送像 -viewWillAppear 这样的消息。相反,您通常会创建一个 UIViewController,其视图包括该 Web 视图以及组成您的选项卡之类的界面的任何其他视图。 或者,您可以拥有许多视图控制器的层次结构,并添加一个 Web 视图作为所有它们的子视图。然后,您可以将 Web 视图委托行为拉出到某个非 UIViewController 控制器类中,以管理 Web 视图的行为。

        【讨论】:

          【解决方案6】:

          您可以让所有视图占据屏幕的一部分,而让您的UIWebView 占据其余部分。在其他视图之间切换的逻辑应该保持不变。

          例如,在 viewDidLoadUIViewControllers 方法中,您可以有类似的内容:

          self.view.frame = CGRectMake(0, 100, 320, 380);
          

          在您的(比如说)AppDelegate 中,您可以正常调用以显示主要的 UIViewController(在您的情况下,这听起来像 UITabBarController?)并且还可以调用添加 @987654328 @。比如说:

          myWebView.view.frame = CGRectMake(0, 0, 320, 100);
          

          视图控制器和UIWebView 将相互独立。

          我相信,您会在包含 iAd 的应用中看到这种模式。我用我的一个免费应用程序做了类似的事情。

          希望这会有所帮助!

          【讨论】:

          • UIViewController 的根视图(作为“视图”属性公开的视图)预计会填充窗口并自动调整大小。使用仅填充部分屏幕的视图创建控制器是有问题的,并且当 UIKit 无法发送控制器正常视图控制器生命周期消息时,可能会导致意外行为。
          【解决方案7】:

          我只需将其添加到 navigationController 本身即可获得相同的效果(如果您没有,则只需添加它)。 在我的一个应用中非常适合我。

          【讨论】:

            【解决方案8】:

            难道您不能在您的应用程序中使用两个 webview 并简单地将最上面的 webview 更改为您更动态的内容吗?

            【讨论】:

              猜你喜欢
              • 2011-05-25
              • 1970-01-01
              • 1970-01-01
              • 2021-09-24
              • 2014-05-11
              • 1970-01-01
              • 2015-05-31
              • 1970-01-01
              • 2021-06-11
              相关资源
              最近更新 更多