Эти коды работают хорошо, пока я не захочу закрыть окно с помощью мыши или с помощью клавиатуры с помощью command + w
, когда я закрываю окно с информацией, возникает ошибка:
Ошибка:
Тема 1: EXC_BAD_ACCESS (код = 1, адрес = 0x20)
Не уверен, почему эта ошибка возникает и как решить проблему! Кстати, я использую основной файл для загрузки своего приложения следующим образом:
import Cocoa
// **** Main **** //
let nsApplication = NSApplication.shared
let appDelegate = AppDelegate()
nsApplication.delegate = appDelegate
nsApplication.run()
И это все мои коды:
import Cocoa
import SwiftUI
class AppDelegate: NSObject, NSApplicationDelegate {
private var window: NSWindow!
func applicationDidFinishLaunching(_ aNotification: Notification) {
buildMainMenu()
buildWindow()
}
func buildWindow() {
window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 100.0, height: 100.0),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.center()
window.setFrameAutosaveName("Main Window")
window.title = "No Storyboard Window"
window.makeKeyAndOrderFront(window)
}
func buildMainMenu() {
let appMainMenu: NSMenu = NSMenu()
let mainMenu: NSMenuItem = NSMenuItem()
mainMenu.submenu = NSMenu(title: "MainMenu")
let mainMenuItem0 = NSMenuItem(title: "About", action: #selector(NSApplication.about), keyEquivalent: "a")
mainMenuItem0.keyEquivalentModifierMask = .command
let mainMenuItem1 = NSMenuItem(title: "Close", action: #selector(NSWindow.performClose(_:)), keyEquivalent: "w")
mainMenuItem1.keyEquivalentModifierMask = .command
let mainMenuItem2 = NSMenuItem(title: "Quit", action: #selector(NSApplication.shared.terminate(_:)), keyEquivalent: "q")
mainMenuItem2.keyEquivalentModifierMask = .command
mainMenu.submenu?.items = [mainMenuItem0, mainMenuItem1, mainMenuItem2]
appMainMenu.items = [mainMenu]
NSApp.mainMenu = appMainMenu
}
}
extension NSApplication {
@objc func about() {
AboutView().openInWindow(title: "About My App", sender: self)
}
}
struct AboutView: View {
var body: some View {
Color.green
.frame(width: 500, height: 200)
}
}
extension View {
@discardableResult
func openInWindow(title: String, sender: Any?) -> NSWindow {
let window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.center()
window.contentView = NSHostingView(rootView: self)
window.title = title
window.makeKeyAndOrderFront(sender)
return window
}
}
Нет только этого, и это не помогает мне найти проблему.
Какое значение окна isReleasedWhenClosed?
У меня больше нет кодов для показа, это все, что у меня есть. Должен ли я установить какое-то значение для окна, когда я создаю его в расширении?
@Milen Я прошу вас проверить значение этого свойства вашего NSWindow в отладчике.
Я проверил это в deinit, и значение было ложным.
let Released = window.isReleasedWhenClosed возвращает true в исходном коде.
Это исправлено одной строкой кода: window.isReleasedWhenClosed = false добавлено в функцию openInWindow(). Ссылка здесь:https://developer.apple.com/forums/thread/651592 . Ваш исходный код уничтожал бы объект окна about каждый раз, когда он открывался и закрывался. Не позволяя ему делать это, ваш код работает без ошибок. Сделайте эту замену.
extension View {
@discardableResult
func openInWindow(title: String, sender: Any?) -> NSWindow {
let window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.center()
window.isReleasedWhenClosed = false
window.contentView = NSHostingView(rootView: self)
window.title = title
window.makeKeyAndOrderFront(sender)
return window
}
}
Спасибо, но окно about должно быть представлением SwiftUI. Также есть и другие окна, для которых требуется настраиваемый swiftui, ваш ответ должен иметь представление swiftUI, как о представлении.
См. редакцию ответа.
В консоли больше подробностей об ошибке?