每个视图都有相同的WebView

时间:2010-12-15 19:59:08

标签: iphone objective-c uiwebview

基本上我WebView上有SecondViewController,我希望WebView在每个视图上都可见,如标签栏,并且每个视图都可以完全控制。

请注意WebView将出现在带有在线幻灯片的网页上,因此我无法在每个视图上重新加载

同样在SecondViewController我有

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

8 个答案:

答案 0 :(得分:3)

我建议您在添加webView后添加tabbarcontroller.view,就像:{/ p>

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

并且最初制作不要让它可见。您应该在app delegate中处理所有与webview相关的方法。现在,只要你不需要它,你就可以通过从你的视图控制器中调用app delegate中写的方法来隐藏它。

希望这会有所帮助。

答案 1 :(得分:1)

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

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

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

如果这很麻烦或者不可行,还有其他两种选择。首先,您可以继承UITabViewController(我假设您在此处使用的是您的问题),并注入额外的视图(调整内容视图的大小以腾出空间)。这是没有证件的,没有支持,所以请注意。但如果你不做太多其他花哨的技巧,那就不难了。

另一个棘手的解决方案是创建第二个UIWindow,使其漂浮在主UIWindow上(或调整主UIWindow的大小以为其腾出空间)。这只是半文档化的,也不是真正支持的。但是,如果您尝试将额外视图置于标签栏下方,则此方法可以正常工作。

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

答案 2 :(得分:1)

我只是设置一个单独的UIWebView,并在该视图控制器即将变为可见时将其添加到每个view-controller-view。这是一种方法:

//.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;
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

例如,在您viewDidLoad的{​​{1}}方法中,您可以使用以下内容:

UIViewController

在您(比如说)self.view.frame = CGRectMake(0, 100, 320, 380); 中,您可以正常通话来显示主AppDelegate(在您的情况下,它听起来像UIViewController?)并且还有一个致电添加UITabBarController。比如说:

UIWebView

视图控制器和myWebView.view.frame = CGRectMake(0, 0, 320, 100); 将彼此独立。

我认为,对于拥有iAd的应用,您会看到此模式。我用我的一个免费应用程序做了类似的事情。

希望这有帮助!

答案 6 :(得分:0)

我只需将它添加到navigationController本身即可获得同样的效果(如果你没有,那么只需添加它)。 在我的一个应用程序中对我很有用。

答案 7 :(得分:-1)

您是否可以在应用程序中使用两个webview,只需使用更具动态性的内容更改最上面的webview?