我有一个基本的cocoa应用程序,它的窗口中只有一个WebViewWebKit.framework引用被添加到os x 10.9(mavericks)上的xcode6beta6项目中。我想知道WebView何时完成页面加载。所以我创建了一个继承WebViewControllerDelegateWebFrameLoadDelegate类。这已经是问题开始的地方:xcode告诉我关于Use of undeclared type 'WebFrameLoadDelegate'。关于this question on Stack Overflow,它不应该。如前所述,WebKit.framework由项目和导入到swift类文件中的WebKit模块引用。我还看到了xcode左侧栏的“headers”文件夹中的WebFrameLoadDelegate.h,在WebKit.framework下面。
所有罪恶的根源是文件11中的lineTestWebView/WebViewControllerDelegate.swift(我忘记删除这里省略的注释)、类声明和协议引用。

import WebKit

class WebViewControllerDelegate: WebFrameLoadDelegate {
    func didFinishLoadForFrame() {
        NSLog("didFinishLoadForFrame()")
    }
}

设置一切的AppDelegate
import Cocoa
import WebKit

class AppDelegate: NSObject, NSApplicationDelegate {
    @IBOutlet weak var window: NSWindow!
    @IBOutlet weak var webView: WebView!
    @IBOutlet weak var webViewControllerDelegate: WebViewControllerDelegate!

    func applicationDidFinishLaunching(aNotification: NSNotification?) {
        self.webView.frameLoadDelegate = self.webViewControllerDelegate
        self.webView.mainFrame.loadRequest(NSURLRequest(URL: NSURL(string: "https://stackoverflow.com/")))
    }

    func applicationWillTerminate(aNotification: NSNotification?) {}
}

有关更多信息,请查看我为这个问题创建的mymy public repository中的代码。

最佳答案

WebFrameLoadDelegate是一个非正式的协议,因此不能声明它的一致性。只需继承NSObject并实现所需的方法。
另外,请注意swift方法名是webView(sender: WebView!, didFinishLoadForFrame frame: WebFrame!),而不仅仅是didFinishLoadForFrame()

class WebViewControllerDelegate: NSObject { // WebFrameLoadDelegate
      override func webView(sender: WebView!, didFinishLoadForFrame frame: WebFrame!) {
      NSLog("didFinishLoadForFrame()")
    }
}

10-08 08:07