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
この投稿へのコメント