Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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
Ios 界面生成器中的WKWebView_Ios_Xcode_Macos_Uiwebview_Wkwebview - Fatal编程技术网

Ios 界面生成器中的WKWebView

Ios 界面生成器中的WKWebView,ios,xcode,macos,uiwebview,wkwebview,Ios,Xcode,Macos,Uiwebview,Wkwebview,XCode 6 beta版中的IB对象模板似乎仍在创建旧式对象(iOS版的UIWebView和OSX版的WebView)。希望苹果能为现代WebKit更新它们,但在此之前,在Interface Builder中创建WKWebViews的最佳方法是什么?我应该创建基本视图(UIView或NSView)并将其类型指定给WKWebView吗?我在网上找到的大多数示例都以编程方式将其添加到容器视图中;出于某种原因,这更好吗?正如一些人所指出的,从Xcode 6.4开始,WKWebView在Interfa

XCode 6 beta版中的IB对象模板似乎仍在创建旧式对象(iOS版的UIWebView和OSX版的WebView)。希望苹果能为现代WebKit更新它们,但在此之前,在Interface Builder中创建WKWebViews的最佳方法是什么?我应该创建基本视图(UIView或NSView)并将其类型指定给WKWebView吗?我在网上找到的大多数示例都以编程方式将其添加到容器视图中;出于某种原因,这更好吗?

正如一些人所指出的,从Xcode 6.4开始,WKWebView在Interface Builder上仍然不可用。但是,通过代码添加它们非常容易

我只是在我的ViewController中使用它。跳过接口生成器

import UIKit
import WebKit

class ViewController: UIViewController {

    private var webView: WKWebView?

    override func loadView() {
        webView = WKWebView()

        //If you want to implement the delegate
        //webView?.navigationDelegate = self

        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        if let url = URL(string: "https://google.com") {
            let req = URLRequest(url: url)
            webView?.load(req)
        }
    }
}

正如一些人所指出的,从Xcode 6.4开始,WKWebView在Interface Builder上仍然不可用。但是,通过代码添加它们非常容易

我只是在我的ViewController中使用它。跳过接口生成器

import UIKit
import WebKit

class ViewController: UIViewController {

    private var webView: WKWebView?

    override func loadView() {
        webView = WKWebView()

        //If you want to implement the delegate
        //webView?.navigationDelegate = self

        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        if let url = URL(string: "https://google.com") {
            let req = URLRequest(url: url)
            webView?.load(req)
        }
    }
}

你是对的,它似乎不起作用。如果查看标题,您将看到:

- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;
这意味着您不能从nib实例化一个


您必须在viewDidLoad或loadView中手动完成此操作。

您是对的-它似乎不起作用。如果查看标题,您将看到:

- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;
这意味着您不能从nib实例化一个


您必须在viewDidLoad或loadView中手动完成此操作。

这在Xcode 7.2中对我很有效

首先将web视图添加为故事板/IB中的UIWebView出口。这将为您提供如下属性:

@property (weak, nonatomic) IBOutlet UIWebView *webView;
然后只需编辑代码即可将其更改为WKWebView

@property (weak, nonatomic) IBOutlet WKWebView *webView;

您还应该在Identity inspector中将自定义类更改为WKWebView。

这在Xcode 7.2中对我很有效

首先将web视图添加为故事板/IB中的UIWebView出口。这将为您提供如下属性:

@property (weak, nonatomic) IBOutlet UIWebView *webView;
然后只需编辑代码即可将其更改为WKWebView

@property (weak, nonatomic) IBOutlet WKWebView *webView;

您还应该在Identity inspector中将自定义类更改为WKWebView。

对于Xcode 8,现在这是可能的,但实现它的方法至少有点不成熟。但是,一个有效的解决方案就是一个有效的解决方案,对吗?让我解释一下

WKWebView的initWithCoder:不再标注为“NS\u不可用”。它现在看起来如下所示

- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
从子类化WKWebView开始,并用编码器重写initWithCoder。您需要使用不同的init方法,而不是调用超级initWithCoder,例如initWithFrame:configuration:。下面是一个简单的例子

- (instancetype)initWithCoder:(NSCoder *)coder
{
    // An initial frame for initialization must be set, but it will be overridden 
    // below by the autolayout constraints set in interface builder. 
    CGRect frame = [[UIScreen mainScreen] bounds];
    WKWebViewConfiguration *myConfiguration = [WKWebViewConfiguration new];

    // Set any configuration parameters here, e.g.
    // myConfiguration.dataDetectorTypes = WKDataDetectorTypeAll; 

    self = [super initWithFrame:frame configuration:myConfiguration];

    // Apply constraints from interface builder.
    self.translatesAutoresizingMaskIntoConstraints = NO;

    return self;
}
在故事板中,使用UIView并为其提供新子类的自定义类。其余的是一切照旧(设置自动布局约束、将视图链接到控制器中的插座等)


最后,WKWebView以不同于UIWebView的方式缩放内容。在这方面,许多人可能希望遵循中的简单建议,使WKWebView更密切地遵循UIWebView的行为。

对于Xcode 8,现在这是可能的,但实现这一点的方法至少有点粗糙。但是,一个有效的解决方案就是一个有效的解决方案,对吗?让我解释一下

WKWebView的initWithCoder:不再标注为“NS\u不可用”。它现在看起来如下所示

- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
从子类化WKWebView开始,并用编码器重写initWithCoder。您需要使用不同的init方法,而不是调用超级initWithCoder,例如initWithFrame:configuration:。下面是一个简单的例子

- (instancetype)initWithCoder:(NSCoder *)coder
{
    // An initial frame for initialization must be set, but it will be overridden 
    // below by the autolayout constraints set in interface builder. 
    CGRect frame = [[UIScreen mainScreen] bounds];
    WKWebViewConfiguration *myConfiguration = [WKWebViewConfiguration new];

    // Set any configuration parameters here, e.g.
    // myConfiguration.dataDetectorTypes = WKDataDetectorTypeAll; 

    self = [super initWithFrame:frame configuration:myConfiguration];

    // Apply constraints from interface builder.
    self.translatesAutoresizingMaskIntoConstraints = NO;

    return self;
}
在故事板中,使用UIView并为其提供新子类的自定义类。其余的是一切照旧(设置自动布局约束、将视图链接到控制器中的插座等)


最后,WKWebView以不同于UIWebView的方式缩放内容。在这方面,许多人可能希望遵循中的简单建议,使WKWebView更密切地遵循UIWebView的行为。

Info.plist

添加您的Info.plist传输安全设置

 <key>NSAppTransportSecurity</key>
 <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
 </dict>
使用Swift 5以编程方式添加视图(完整示例)


Info.plist

添加您的Info.plist传输安全设置

 <key>NSAppTransportSecurity</key>
 <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
 </dict>
使用Swift 5以编程方式添加视图(完整示例)


下面是一个简单的Swift 3版本,它基于crx_au的优秀答案

import WebKit

class WKWebView_IBWrapper: WKWebView {
    required convenience init?(coder: NSCoder) {
        let config = WKWebViewConfiguration()
        //config.suppressesIncrementalRendering = true //any custom config you want to add
        self.init(frame: .zero, configuration: config)
        self.translatesAutoresizingMaskIntoConstraints = false
    }
}
在Interface Builder中创建UIView,分配约束,并将其
WKWebView\u IBWrapper
分配为自定义类,如下所示:


身份检查器选项卡[1]“>

这里有一个简单的Swift 3版本,它基于crx_au
的优秀答案

import WebKit

class WKWebView_IBWrapper: WKWebView {
    required convenience init?(coder: NSCoder) {
        let config = WKWebViewConfiguration()
        //config.suppressesIncrementalRendering = true //any custom config you want to add
        self.init(frame: .zero, configuration: config)
        self.translatesAutoresizingMaskIntoConstraints = false
    }
}
在Interface Builder中创建UIView,分配约束,并将其
WKWebView\u IBWrapper
分配为自定义类,如下所示:


身份检查器选项卡[1]“>

这显然已在Xcode 9b4中修复。发行说明中说“iOS对象库中提供了WKWebView。”


我还没有深入研究它是否需要iOS 11或是向后兼容

这显然已在Xcode 9b4中修复。发行说明中说“iOS对象库中提供了WKWebView。”


我还没有深入研究它是否需要iOS 11或是向后兼容

在XCode 9.0.1版中,可在Interface Builder上使用WKWebView。

在XCode 9.0.1版中,可在Interface Builder上使用WKWebView。

如果在最新版本的XCode(即v9.2+)中仍面临此问题,只需将Webkit导入到ViewController:

#import <WebKit/WebKit.h>
#导入
  • 在修复之前:

  • 修复后:


  • 如果您在最新版本的Xcode(即v9.2+)中仍面临此问题,只需将Webkit导入到您的ViewController:

    #import <WebKit/WebKit.h>
    
    #导入
    
  • 在修复之前:

  • 修复后:


  • 从Xcode 9开始,您可以在IB中实例化和配置WKWebView,而无需在代码中进行。

    请注意,您的部署目标必须高于IOS10,否则将出现编译时错误


    您可以实例化和