WKUIDelegate
自定义 WKUIDelegate(Objective-C)
在 macOS 开发中,WKWebView
是一个强大的网页视图组件,它可以用来显示网页内容。要自定义 WKWebView
的行为,比如处理新窗口的打开、JavaScript 的弹窗(如 alert
、confirm
等),你需要实现 WKUIDelegate
协议。
Step1. 创建一个类,继承自 NSObject
并实现 WKUIDelegate
首先,创建一个自定义类,该类需要实现 WKUIDelegate
协议。
#import <WebKit/WebKit.h>
@interface CustomWebViewUIDelegate : NSObject <WKUIDelegate>
@end
@implementation CustomWebViewUIDelegate
// 处理 JavaScript 的 alert 弹窗
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
NSAlert *alert = [[NSAlert alloc] init];
alert.messageText = message;
[alert addButtonWithTitle:@"OK"];
[alert runModal];
completionHandler();
}
// 处理 JavaScript 的 confirm 弹窗
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {
NSAlert *alert = [[NSAlert alloc] init];
alert.messageText = message;
[alert addButtonWithTitle:@"OK"];
[alert addButtonWithTitle:@"Cancel"];
NSModalResponse response = [alert runModal];
completionHandler(response == NSAlertFirstButtonReturn);
}
// 处理 JavaScript 的 prompt 弹窗
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *))completionHandler {
NSAlert *alert = [[NSAlert alloc] init];
alert.messageText = prompt;
NSTextField *input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)];
[input setStringValue:defaultText];
[alert setAccessoryView:input];
[alert addButtonWithTitle:@"OK"];
[alert addButtonWithTitle:@"Cancel"];
NSModalResponse response = [alert runModal];
if (response == NSAlertFirstButtonReturn) {
completionHandler([input stringValue]);
} else {
completionHandler(nil);
}
}
// 处理新窗口请求
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
if (!navigationAction.targetFrame.isMainFrame) {
[webView loadRequest:navigationAction.request];
}
return nil;
}
@end
Step2. 在你的视图控制器中使用这个自定义的 WKUIDelegate
在你的视图控制器中,创建 WKWebView
实例并将其 UIDelegate
设置为你自定义的类。
#import "ViewController.h"
#import "CustomWebViewUIDelegate.h"
@interface ViewController ()
@property (strong, nonatomic) WKWebView *webView;
@property (strong, nonatomic) CustomWebViewUIDelegate *webViewUIDelegate;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 初始化 WKWebView
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
// 设置 UIDelegate
self.webViewUIDelegate = [[CustomWebViewUIDelegate alloc] init];
self.webView.UIDelegate = self.webViewUIDelegate;
// 将 WKWebView 添加到视图
[self.view addSubview:self.webView];
// 加载网页
NSURL *url = [NSURL URLWithString:@"https://www.example.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
}
@end
通过自定义 WKUIDelegate
,你可以完全控制 WKWebView
的用户界面行为,处理 JavaScript 弹窗、创建新窗口等操作。这种方式为你提供了灵活的网页内容显示和交互体验。
本文作者:Maeiee
本文链接:WKUIDelegate
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!