Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 每个视图上的WebView相同_Iphone_Objective C_Uiwebview - Fatal编程技术网

Iphone 每个视图上的WebView相同

Iphone 每个视图上的WebView相同,iphone,objective-c,uiwebview,Iphone,Objective C,Uiwebview,基本上,我在SecondViewController上有一个WebView,我希望WebView在每个视图上都像选项卡栏一样可见,并且在每个视图上都可以完全控制 请注意,WebView将位于带有在线幻灯片的网页上,因此我不能简单地在每个视图上重新加载 在SecondViewController中,我还有 - (void)webViewDidFinishLoad:(UIWebView *)YouTubePlayer { 听起来您试图将视图置于此视图之上,但不是模态视图。有一篇我曾经看到的博客文章

基本上,我在
SecondViewController
上有一个
WebView
,我希望
WebView
在每个视图上都像选项卡栏一样可见,并且在每个视图上都可以完全控制

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

SecondViewController
中,我还有

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

听起来您试图将视图置于此视图之上,但不是模态视图。有一篇我曾经看到的博客文章描述了你将如何做这样的事情。我认为这也适用于您的情况:

您的应用程序不能使用两个Web视图,而只需使用更动态的内容更改最上面的Web视图吗?

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

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

例如,在
UIViewController
s的
viewDidLoad
方法中,可以有如下内容:

self.view.frame = CGRectMake(0, 100, 320, 380);
myWebView.view.frame = CGRectMake(0, 0, 320, 100);
在您的(比如)AppDelegate中,您可以正常调用以显示主
UIViewController
(在您的情况下,它听起来像
UIAbbarController
?),还可以调用添加
UIWebView
。比如说:

self.view.frame = CGRectMake(0, 100, 320, 380);
myWebView.view.frame = CGRectMake(0, 0, 320, 100);
视图控制器和
UIWebView
将相互独立

我相信,你会看到这种模式,在有网络成瘾的应用程序中。我用我的一个免费应用做过类似的事情


希望这有帮助

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

[self addSubview:[[PinnedViewController sharedController] view]];
这会将视图移动到当前处于活动状态的人(将视图设为子视图会自动将您从旧层次结构中移除)

如果这很麻烦或不可行,还有两种选择。首先,您可以将
UITabViewController
子类化(根据您的问题,我假设这就是您在这里使用的),并插入额外的视图(调整内容视图的大小以腾出空间)。这是没有文件记录和不支持的,所以请注意。但如果你不做太多其他花哨的把戏,这并不是难以置信的困难

另一个棘手的解决方案是创建第二个浮动在主
UIWindow
上的
UIWindow
(或者调整主
UIWindow
的大小以腾出空间)。这只是半文档化的,也没有得到真正的支持。但是,如果您试图将额外视图放在选项卡栏下面,这种方法就可以工作


但是,如果您的系统足够简单,我建议您让所有视图控制器手动管理固定视图。这样可以节省大量的代码挖掘,而且不必依赖任何未记录的内部视图层次结构。

我建议在添加
tabbarcontroller.view
之后,在您的窗口上添加
webView
,如下所示:

[window addSubview:tabbarController.view];
[window addSubview:webview];
[window makeKeyAndVisible];
并在开始时使其可见,而不是使其可见。您应该在应用程序委托中处理所有与webview相关的方法。现在,只要您不需要它,就可以通过从视图控制器调用您在应用程序中编写的委托方法来隐藏它


希望这有帮助

我刚刚设置了一个单例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;
}

我通过简单地将其添加到navigationController本身(如果您没有导航控制器,那么只需添加它)获得了相同的效果。
在我的一个应用程序中非常适合我。

我正在使用视图上的选项卡,如果这有什么不同,UIViewController的根视图(显示为“视图”属性的根视图)将填充窗口并自动调整大小。使用仅填充部分屏幕的视图创建控制器是有问题的,并且当UIKit无法发送控制器正常视图控制器生命周期消息时,可能会导致意外行为。我在.h中的-(UIWebView*)webView{return[SharedWebView shared];}出现错误