Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 导航到另一个xib时,AppKit(主)线程问题上未运行_Swift_Macos_Swift4_Xib_Safari Extension - Fatal编程技术网

Swift 导航到另一个xib时,AppKit(主)线程问题上未运行

Swift 导航到另一个xib时,AppKit(主)线程问题上未运行,swift,macos,swift4,xib,safari-extension,Swift,Macos,Swift4,Xib,Safari Extension,我的应用程序的用例是有一个登录ui,它在SafariExtensionViewController.xib中处理,当用户点击登录按钮时,必须显示另一个ui,即ExtensionStepsViewController.xib。我使用以下命令导航到另一个屏幕 self.presentViewControllerAsSheet(ExtensionStepsViewController()) 然而,我得到以下问题 void assertRunningOnAppKitThread(void)()中的断

我的应用程序的用例是有一个登录ui,它在
SafariExtensionViewController.xib
中处理,当用户点击登录按钮时,必须显示另一个ui,即
ExtensionStepsViewController.xib
。我使用以下命令导航到另一个屏幕

self.presentViewControllerAsSheet(ExtensionStepsViewController())
然而,我得到以下问题

  • void assertRunningOnAppKitThread(void)()中的断言失败,2018-09-05 15:02:30.318742+0545扩展[13150:1422110] [常规]未在AppKit(主)线程上运行
这是我的密码

SafariExtensionViewController.swift

import SafariServices

class SafariExtensionViewController: SFSafariExtensionViewController {


    @IBOutlet weak var passwordMessage: NSTextField!
    @IBOutlet weak var emailMessage: NSTextField!
    @IBOutlet weak var message: NSTextField!
    @IBOutlet weak var email: NSTextField!
    @IBOutlet weak var password: NSSecureTextField!
    static let shared = SafariExtensionViewController()
    override func viewDidLoad() {
        message.stringValue = ""
        emailMessage.stringValue = ""
        passwordMessage.stringValue = ""
    }


    @IBAction func userLogin(_ sender: Any) {
        let providedEmailAddress = email.stringValue
        let providedPassword = password.stringValue
        let isEmailAddressValid = isValidEmailAddress(emailAddressString: providedEmailAddress)
        self.message.stringValue = ""
        emailMessage.stringValue = ""
        passwordMessage.stringValue = ""
        if isEmailAddressValid && providedPassword.count > 0 {
            let session = URLSession.shared
            var request = URLRequest(url: URI!)
            request.httpMethod = "POST"
            do {
                request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
            } catch let error {
                print(error.localizedDescription)
            }
            request.addValue("application/json", forHTTPHeaderField: "Content-Type")
            let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in

                guard error == nil else {
                    return
                }

                guard let data = data else {
                    return
                }

                do {
                    //create json object from data
                    if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                        if let httpResponse = response as? HTTPURLResponse {
                            if (httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
                                print("#########LOGIN########################")
                                self.message.stringValue = "Login Successful"
                                self.message.textColor = NSColor.green

                                UserDefaults.standard.set(providedEmailAddress, forKey: "email")
                                self.presentViewControllerAsSheet(ExtensionStepsViewController()) // error is thrown after this action
                            } else {
                                self.message.stringValue = "Invalid Credentials"
                                self.message.textColor = NSColor.red
                            }
                        }
                        // handle json...
                    }
                } catch let error {
                    print(error.localizedDescription)
                }
            })
            task.resume()
        } else {
            emailMessage.textColor = NSColor.red
            emailMessage.stringValue = "Invalid Email"
        }
    }

  }

当登录成功,然后执行此语句时,
self.presentViewControllerAsheet(ExtensionStepsViewController())
在调试部分打印
print(“hello”)
,我得到列出的问题。

对UI的所有更新都必须从主线程完成。似乎主线程上没有调用
completionHandler
,这导致该断言失败

您需要在主队列上执行演示。可以通过按如下方式安排块来完成此操作:

DispatchQueue.main.async {
  // This will  now run on the main queue.
  self.presentViewControllerAsSheet(ExtensionStepsViewController())
}

我不知道这一个是工作或没有,但问题是现在不存在。它会被导航,但窗口会在一秒钟内关闭。这是因为没有人持有对该对象的强引用-它正在被释放
DispatchQueue.main.async {
  // This will  now run on the main queue.
  self.presentViewControllerAsSheet(ExtensionStepsViewController())
}