viva Cocoaさんのコードサンプルwebsにおけるアップデート内容

主題
viva CocoaさんのXcodeとSwiftで作るMac OS Xアプリ開発の第18章ドキュメント・ベースド・アプリケーションにおけるコードサンプルwebsについて、アップデートした内容を説明する。

背景
今まで3個のmacOS用アプリを公開してきた。しかしながら、その多くにおいて取ってきた手法は、Web上に公開されているサンプルコードを組み合わせるというものだった。この辺りで軌道修正したいと思いつつも、新しいアプリでもサンプルコードを求める癖は抜けなかった。
そこで見つけたのがviva CocoaさんのXcodeとSwiftで作るMac OS Xアプリ開発の最終章にあるMemo Padであった。そこから逆にリンクを辿ってたどり着いたコンテンツはかなり体系的に整理されているようだった。これはうってつけだと思い、第1章から勉強し直すことにした。だが考え方は今でも全く問題なく通じるものの、掲載のコードサンプルにdeprecateされた内容などがあり、アップデートが必要なことが分かった。

コードサンプル
変更点は、コメントにて説明している。

        import Cocoa
        import WebKit

        // WebFrameLoadDelegateはmacOS 10.14でdeprecateになった。
        // class ViewController: NSViewController, WebFrameLoadDelegate
        class ViewController: NSViewController {

            var url  = "https://www.apple.com/jp/"

            static var offset = -1

            @IBOutlet weak var web: WKWebView!
            @IBOutlet weak var textField: NSTextField!
            @IBAction func endEditing(_ sender: NSTextField) {
                url = sender.stringValue
                loadWeb()
            }

            func loadWeb() {
                let url = NSURL(string: self.url)
                let req = NSURLRequest(url: url! as URL)
                web.load(req as URLRequest)
            }

            /*
             Objective-C版は
             
[iOS 8] WKWebView で Web ページのタイトルやURLを表示する 〜 Objective-C 編
これは、そのSwift版 */ override func observeValue( forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer? ) { if keyPath == "title" { self.view.window?.title = self.web.title! } else if keyPath == "URL" { if let url = change![NSKeyValueChangeKey.newKey] as? URL { let urlString: String = url.absoluteString textField.stringValue = urlString } } } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. // Deprecateされた。 // web.frameLoadDelegate = self ViewController.offset += 1 loadWeb() // WKWebView インスタンスのプロパティの変更を監視する web?.addObserver( self, forKeyPath: "title", options: .new, context: nil) // WKWebView インスタンスのプロパティの変更を監視する web?.addObserver( self, forKeyPath: "URL", options: .new, context: nil) } // 最後はガイドによるとCGPointMakeだが、CGPointに変更された。 override func viewWillAppear() { var originX = view.window?.frame.origin.x let originY = view.window?.frame.origin.y originX! += CGFloat(ViewController.offset) * 30 view.window?.setFrameOrigin(CGPoint(x: originX!, y: originY!)) } /* Deprecateされた func webView(sender: WebView!, didReceiveTitle title: String!, forFrame frame: WebFrame!) { sender.window?.title = title } func webView(sender: WebView!, didStartProvisionalLoadForFrame frame: WebFrame!) { textField.stringValue = (frame.provisionalDataSource.request.URL?.absoluteString)! } */ // WKWebView インスタンスのプロパティの変更を監視を解除する deinit { web?.removeObserver(self, forKeyPath: "title") web?.removeObserver(self, forKeyPath: "URL") } override var representedObject: Any? { didSet { // Update the view, if already loaded. } } }

以上。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL