从 Nib 或 Storyboard 在 WKWebView 上设置 WKWebViewConfiguration
Set WKWebViewConfiguration on WKWebView from Nib or Storyboard
使用 iOS11 Apple 已添加功能集,可在您的笔尖和故事板上添加 WKWebViews 插座。使用自动设置的默认 WKWebViewConfiguration 时,它似乎工作正常。
但是,我希望能够使用自定义 WKWebViewConfiguration。无论如何,我可以在 WKWebView 从笔尖初始化之前或之后设置它吗?
无法通过故事板中 WKWebView 的出口设置 WKWebView 的配置,因为 WKWebView 的配置 属性 是只读的,相反我们需要以编程方式配置,如下所示。
class ViewController: UIViewController, WKScriptMessageHandler {
@IBOutlet weak var webContentView: UIView!
var webView: WKWebView?
let contentController = WKUserContentController()
contentController.add(self, name: "callbackHandler")
let configuration = WKWebViewConfiguration()
configuration.userContentController = contentController
self.webView = WKWebView(frame: self.webContentView.bounds, configuration: configuration)
self.webContentView.addSubview(self.webView!)
}
并实现 WKScriptMessageHandler 委托方法
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if (message.name == "callbackHandler"){
print("\(message.body)")
}
}
希望这对您有所帮助...
Let's Example your customize configuration.
NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
//Here you can customize configuration
[self.webView.configuration.userContentController addUserScript:wkUScript];
// self.webView.navigationDelegate = self;
// self.webView.contentMode = UIViewContentModeScaleAspectFill;
您可以在 Storyboard 中创建 WKWebView,然后使用 WKUIDelegate:createWebViewWith
仅通过配置创建新的 WKWebView。
class WindowViewController: UIViewController {
// The WKWebView created from storyboard
@IBOutlet var webView: WKWebView!
override func viewDidLoad() {
// Delegate the webview's uiDelegate
self.webView.uiDelegate = self
}
}
extension WindowViewController: WKUIDelegate {
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
// Create new WKWebView with custom configuration here
let configuration = WKWebViewConfiguration()
return WKWebView(frame: webView.frame, configuration: configuration)
}
}
是的!!!我们可以通过 Nib 或 Storyboard 在 WKWebView 上设置 WKWebViewConfiguration 我正在使用以下代码:
这是我的 IBOutlet--
@IBOutlet var webViewChat: WKWebView!
//使用下面的代码你可以设置配置
webViewChat.configuration.userContentController.add(self, name: "edit")
webViewChat.configuration.userContentController.add(self, name: "remove")
注意: 确保在设置配置后加载URL
我的回答并不能解决所有人的问题,但一定要检查 Storyboard 中的 WKWebView 的 Attributes Inspector 以查看是否要对配置进行更改可以在那里设置。
我只花了一个小时试图在代码中解决这个问题,当时我所要做的只是在属性检查器中选中 2 个框。
对于 Objective C:
WKWebViewConfiguration *config = _webView.configuration;
WKUserContentController* ctrl = [[WKUserContentController alloc] init];
[ctrl addScriptMessageHandler:self name:@"method1"];
[ctrl addScriptMessageHandler:self name:@"method2"];
// others ...
config.userContentController = ctrl;
并添加 WKScriptMessageHandler 的实现:
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
NSLog(@"userContentController:didReceiveScriptMessage: message=%@", message);
if ([message.name isEqualToString:@"method1"] && message.body
// &&[message.body isKindOfClass:[NSString class]]
) {
// do something
} else if ([message.name isEqualToString:@"method2"] && message.body
) {
// do something
}
}
使用 iOS11 Apple 已添加功能集,可在您的笔尖和故事板上添加 WKWebViews 插座。使用自动设置的默认 WKWebViewConfiguration 时,它似乎工作正常。
但是,我希望能够使用自定义 WKWebViewConfiguration。无论如何,我可以在 WKWebView 从笔尖初始化之前或之后设置它吗?
无法通过故事板中 WKWebView 的出口设置 WKWebView 的配置,因为 WKWebView 的配置 属性 是只读的,相反我们需要以编程方式配置,如下所示。
class ViewController: UIViewController, WKScriptMessageHandler {
@IBOutlet weak var webContentView: UIView!
var webView: WKWebView?
let contentController = WKUserContentController()
contentController.add(self, name: "callbackHandler")
let configuration = WKWebViewConfiguration()
configuration.userContentController = contentController
self.webView = WKWebView(frame: self.webContentView.bounds, configuration: configuration)
self.webContentView.addSubview(self.webView!)
}
并实现 WKScriptMessageHandler 委托方法
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if (message.name == "callbackHandler"){
print("\(message.body)")
}
}
希望这对您有所帮助...
Let's Example your customize configuration.
NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
//Here you can customize configuration
[self.webView.configuration.userContentController addUserScript:wkUScript];
// self.webView.navigationDelegate = self;
// self.webView.contentMode = UIViewContentModeScaleAspectFill;
您可以在 Storyboard 中创建 WKWebView,然后使用 WKUIDelegate:createWebViewWith
仅通过配置创建新的 WKWebView。
class WindowViewController: UIViewController {
// The WKWebView created from storyboard
@IBOutlet var webView: WKWebView!
override func viewDidLoad() {
// Delegate the webview's uiDelegate
self.webView.uiDelegate = self
}
}
extension WindowViewController: WKUIDelegate {
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
// Create new WKWebView with custom configuration here
let configuration = WKWebViewConfiguration()
return WKWebView(frame: webView.frame, configuration: configuration)
}
}
是的!!!我们可以通过 Nib 或 Storyboard 在 WKWebView 上设置 WKWebViewConfiguration 我正在使用以下代码:
这是我的 IBOutlet--
@IBOutlet var webViewChat: WKWebView!
//使用下面的代码你可以设置配置
webViewChat.configuration.userContentController.add(self, name: "edit")
webViewChat.configuration.userContentController.add(self, name: "remove")
注意: 确保在设置配置后加载URL
我的回答并不能解决所有人的问题,但一定要检查 Storyboard 中的 WKWebView 的 Attributes Inspector 以查看是否要对配置进行更改可以在那里设置。
我只花了一个小时试图在代码中解决这个问题,当时我所要做的只是在属性检查器中选中 2 个框。
对于 Objective C:
WKWebViewConfiguration *config = _webView.configuration;
WKUserContentController* ctrl = [[WKUserContentController alloc] init];
[ctrl addScriptMessageHandler:self name:@"method1"];
[ctrl addScriptMessageHandler:self name:@"method2"];
// others ...
config.userContentController = ctrl;
并添加 WKScriptMessageHandler 的实现:
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
NSLog(@"userContentController:didReceiveScriptMessage: message=%@", message);
if ([message.name isEqualToString:@"method1"] && message.body
// &&[message.body isKindOfClass:[NSString class]]
) {
// do something
} else if ([message.name isEqualToString:@"method2"] && message.body
) {
// do something
}
}