ios 从Nib或情节提要在WKWebView上设置WKWebView配置

pprl5pva  于 2023-01-03  发布在  iOS
关注(0)|答案(6)|浏览(162)

在iOS 11中,苹果增加了在笔尖和故事板上添加WKWebView插座的能力集。当使用自动设置的默认WKWebView配置时,它似乎工作得很好。
然而,我希望能够使用自定义的WKWebViewConfiguration。有没有什么方法可以在WKWebView从笔尖初始化之前或之后设置它?

63lcw9qa

63lcw9qa1#

让我们举例说明您的自定义配置。

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;
d7v8vwbk

d7v8vwbk2#

您可以在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)
    }
}
t2a7ltrp

t2a7ltrp3#

是的!!!我们可以设置WKWebViewConfiguration的WKWebView从笔尖或故事板我使用下面的代码:
这是我的IBOutlet--

@IBOutlet  var webViewChat: WKWebView!

//使用下面的代码可以设置配置

webViewChat.configuration.userContentController.add(self, name: "edit")
 webViewChat.configuration.userContentController.add(self, name: "remove")

**注意:**确保在设置配置后加载URL

j0pj023g

j0pj023g4#

由于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)")
    }
}

希望这能帮上忙...

dddzy1tm

dddzy1tm5#

我的答案并不能解决所有人的问题,但是一定要检查情节提要中的WKWebView的属性检查器,看看是否可以在那里设置您想要对配置进行的更改。
我刚刚花了一个小时试图用代码来解决这个问题,当时我所要做的就是在属性检查器中选中2个框。

nr7wwzry

nr7wwzry6#

对于目标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
    }
}

相关问题