Swift 如何配置WKWebView以填充NSW窗口?

Swift 如何配置WKWebView以填充NSW窗口?,swift,macos,cocoa,wkwebview,nsviewcontroller,Swift,Macos,Cocoa,Wkwebview,Nsviewcontroller,我有一个使用XCode 7.2在Swift中开发的小型原型应用程序。该应用程序是作为一个基于Cocoa文档的应用程序创建的,带有故事板。因此,该项目包含AppDelegate.swift、Document.swift和Main.storyboard,所有这些都与XCode生成的内容相同,以及ViewController.swift,其中包含以下内容: import Cocoa import WebKit class ViewController: NSViewController {

我有一个使用XCode 7.2在Swift中开发的小型原型应用程序。该应用程序是作为一个基于Cocoa文档的应用程序创建的,带有故事板。因此,该项目包含
AppDelegate.swift
Document.swift
Main.storyboard
,所有这些都与XCode生成的内容相同,以及
ViewController.swift
,其中包含以下内容:

import Cocoa
import WebKit

class ViewController: NSViewController {

    var webView: WKWebView {
        return view as! WKWebView
    }

    override func loadView() {
        view = WKWebView(/*frame: CGRect(x: 0, y: 0, width: 200, height: 200)*/)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        webView.loadHTMLString("<html><body><p>Hello, World!</p></body></html>", baseURL: nil)
    }
}
导入可可粉
导入WebKit
类ViewController:NSViewController{
var-webView:WKWebView{
返回视图为!WKWebView
}
重写func loadView(){
视图=WKWebView(/*帧:CGRect(x:0,y:0,宽度:200,高度:200)*/)
}
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后执行任何其他设置。
webView.loadHTMLString(“你好,世界!

”,baseURL:nil) } }
我已经重写了
loadView()
以直接创建a
WKWebView
,并将其分配给
ViewController
view
属性作为根视图,而不是加载脚本中定义的视图

请注意,
WKWebView
frame
参数可能会被注释为输入或输出,以演示此问题的根源所在的不同行为

期望的行为
WKWebView
实例应该填充每个文档对应的窗口,新文档窗口的初始大小和位置应该是为序列图像板中的
NSWindow
定义的窗口(480x270 at(196240))。
WKWebView
应使用封闭窗口调整大小

观察到的行为 没有
框架
参数 如果没有
frame
参数,则在运行应用程序时不会显示任何文档窗口,即使窗口菜单显示已创建“无标题”文档。当使用文件>新建创建更多文档(无标题的2等)时,也不会显示文档窗口

但是,如果使用View>Enter full screen全屏显示文档,则会按预期显示
WKWebView
及其问候语

使用
框架
参数 使用
frame
参数,包含
WKWebView
及其问候语的文档窗口将按照
CGRect
中给出的大小和位置显示

问题: 我不明白为什么在未指定
WKWebView
的框架时,视图在全屏模式下被强制为容器(屏幕)的大小,但在窗口模式下,情况似乎相反:窗口被强制为视图的(退化?)大小,因此变得不可见。我希望新视图采用故事板中定义的窗口大小


在我的
ViewController
中,如何配置我的
WKWebView
实例来填充文档框架生成的与每个
NSDocument
对应的
NSWindow
?或者,也许我的方法是错误的,我应该通过
ViewController.loadView()

中的视图大小来配置初始窗口大小,所以我的第一个反应是:为什么不将WKWebView添加到情节提要中?这样,您可以调整它的大小,使其与封闭窗口的大小相同。事实证明,您无法将WKWebView添加到Interface Builder中(这就是为什么我认为您必须这样做的原因)

默认情况下,loadView将nib中的实例化视图连接到视图控制器的view属性。覆盖loadView然后指定self.view的问题在于,它会破坏窗口内容与ViewController之间的故事板关系

因此,解决方案是等待self.view从情节提要加载,然后将WKWebView添加为子视图:

- (void)viewDidLoad {
    WKWebView *wb = [[WKWebView alloc] initWithFrame:self.view.frame];
    [wb loadHTMLString:@"<html><body><p>Hello, World!</p></body></html>" baseURL:nil];
    [self.view addSubview:wb];
}
-(void)viewDidLoad{
WKWebView*wb=[[WKWebView alloc]initWithFrame:self.view.frame];
[wb loadHTMLString:@“你好,世界!

”baseURL:nil]; [self.view addSubview:wb]; }

我只有Objective-C。对不起,我还没有学会Swift

试试这个方法。您应该首先调用super.loadView()。这将为您提供从情节提要加载的视图的初始大小。然后使用原始视图的框架将视图本身更改为web视图。希望这能解决你的问题

override func loadView() {
    super.loadView()
    view = WKWebView(frame:self.view.frame)
}
您还可以尝试设置web视图的背景色,以查看其是否正常工作


webView.loadHTMLString(你好,世界!

”,baseURL:nil)

此方法的问题是在调整窗口大小时它不会调整大小。原始问题试图将ViewController本身的视图更改为web视图。原始问题询问如何使用序列图像板中指定的窗口尺寸和位置使WKWebView填充其包含的窗口,这正是我的代码所做的。没有提到调整大小。确实需要调整大小。故事板中的窗口是可调整大小的,因此WKWebView应该随之调整大小,正如Pradeep所说。正如我所说,问题中的任何内容都不需要这样做。如果您需要它调整大小,请编辑您的问题。@rocky“WKWebView应使用封闭窗口调整大小”这句话怎么样?请检查我的答案。可以,但我现在不在电脑旁,无法验证。如果您能说服我您确实在Mac上尝试过这一功能,并且它有效,我将接受这个答案。接下来的几天我将离开我的Mac电脑,所以我自己无法验证。是的,我在Mac电脑上做了这件事并回答了。下面是该应用程序的视频。