SwiftUI macOS NSTextViewを使う 値変更をSwiftUIに連携
「SwiftUI macOS NSTextViewを使う とりあえず配置」の続きになります。
GitHub:uRaKaMi
Coordinator関連実装
import AppKit
import SwiftUI
struct AppKitNSTextView: NSViewRepresentable {
typealias NSViewType = NSTextView
@Binding var string: String
let width: CGFloat
let height: CGFloat
func makeNSView(context: Context) -> NSTextView {
let view = NSTextView(frame: NSRect(x: 0, y: 0, width: width, height: height))
view.delegate = context.coordinator
return view
}
func updateNSView(_ nsView: NSTextView, context: Context) {
}
func makeCoordinator() -> Coordinator {
Coordinator(appKitNSTextView: self)
}
}
extension AppKitNSTextView {
class Coordinator: NSObject, NSTextViewDelegate {
var parent: AppKitNSTextView
init(appKitNSTextView: AppKitNSTextView) {
self.parent = appKitNSTextView
}
func textView(_ textView: NSTextView, shouldChangeTextIn affectedCharRange: NSRange, replacementString: String?) -> Bool {
return true
}
func textDidChange(_ notification: Notification) {
guard let textView = notification.object as? NSTextView else {
return
}
self.parent.string = textView.string
}
}
}
SwiftUI側
import SwiftUI
struct ContentView: View {
@State var urakami = ""
let appDelegate: AppDelegate = NSApplication.shared.delegate as! AppDelegate
var body: some View {
VStack {
AppKitNSTextView(string: $urakami,
width: appDelegate.window.frame.width,
height: appDelegate.window.frame.height - 100)
Text(urakami)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}





