Как исправить «фатальную ошибку: неожиданно обнаружил ноль при неявном развертывании необязательного значения» при использовании tableview.reloaddata - PullRequest
0 голосов
/ 22 мая 2019

Я создаю приложение, в котором я использую NSOpenPanel, связанный с меню Файл -> Открыть .... Когда пользователь выбирает файл .txt, программа читает его, добавляет значения в существующий массив строк и затем ДОЛЖНА перезагрузить данные в TableView. Но когда я вызываю tableview.reloaddata(), во время выполнения выдается следующая ошибка: Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value.

Вот код моего AppDelegate.swift файла:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    let vc = ViewController(nibName: "ViewController", bundle: nil)

    func applicationDidFinishLaunching(_ aNotification: Notification) {
    // Insert code here to initialize your application
    }

    func applicationWillTerminate(_ aNotification: Notification) {
    // Insert code here to tear down your application
    }

    func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
    return true
    }

    @IBAction func openUnFichier(_ sender: NSMenuItem) {
        let fichierPanel: NSOpenPanel = NSOpenPanel()
        fichierPanel.allowsMultipleSelection = false
        fichierPanel.canChooseFiles = true
        fichierPanel.canChooseDirectories = false
        fichierPanel.allowedFileTypes = ["txt"]
        let response = fichierPanel.runModal()
        if response == NSApplication.ModalResponse.OK{
            guard let selectedURL = fichierPanel.url else{return}
            do{
                var fullDocument = try String(contentsOf: selectedURL, encoding: String.Encoding.utf8)
                print(type(of: fullDocument))
                var lines : [String] = fullDocument.components(separatedBy: "\n" as String)
                for line in lines {
                    vc.test_data.append(line)
                    print(type(of: vc.test_data))
                }
                } catch let error as NSError{
                    print("Erreur!!!!!!! \(error)")
                }
            vc.tableView.reloadData() //IT CRASHES HERE
         }else {

        }
    }
 }

А вот код моего ViewController.swift:

import Cocoa
import WebKit

class ViewController: NSViewController, NSTableViewDataSource{

    public var test_data = ["https://www.youtube.com/watch?v=0AQFQMeOAig", "https://www.youtube.com/watch?v=domoD_w3uFw"]
    var test_text = ""
    var nextUrl = ""

    //func

    func refresh(){
        tableView.reloadData()
    }

    @IBAction func plus(_ sender: NSButton) {
        if urlInput.stringValue == "" {

        } else {
        test_text = urlInput.stringValue
        test_data.append(test_text)
        urlInput.stringValue = ""
        tableView.reloadData()
        // fonction du bouton +
        }
    }

    @IBAction func nextLien(_ sender: NSButton) {
        if test_data == [] {

        } else {
        nextUrl=test_data[0]
        var monUrl = URL(string: nextUrl)
        var maRequete = URLRequest(url: monUrl!)
        view_web.load(maRequete)
        test_data.remove(at: 0)
        tableView.reloadData()
        //fonction du bouton pour le prochain lien
        }
    }

    func numberOfRows(in tableView: NSTableView) -> Int {
        return test_data.count
    }

    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
        return test_data[row]
    }

    //var

    @IBOutlet weak var urlInput: NSTextField!

    @IBOutlet weak var view_web: WKWebView!

    @IBOutlet weak var tableView: NSTableView!


    //func vitale

    override func viewDidLoad() {
        super.viewDidLoad()

        let myURL = URL(string: "https://www.youtube.com")
        let myRequest = URLRequest(url: myURL!)
        view_web.configuration.preferences.plugInsEnabled = true
        view_web.load(myRequest)
        // Do any additional setup after loading the view.
    }
}

Что я не понимаю, так это то, что viewtable.reloaddata() отлично работает в файле ViewController.swift, но та же самая инструкция не работает, когда я пытаюсь сделать это в файле AppDelegate.

У меня есть проверка, что мой массив строк (test_data) не пуст. (Он содержит 4 элемента после загрузки и извлечения данных из файла «.txt», который я создал сам.)

Я хотел бы знать, как можно исправить эту ошибку, чтобы данные отображались в моем TableView после анализа моего txt-файла.

Большое спасибо.

1 Ответ

0 голосов
/ 22 мая 2019

Существует простое решение: переместите IBAction в контроллер вида.

  • В Интерфейсном Разработчике отключите IBAction от AppDelegate.
  • Переместите метод openUnFichier на ViewController (удалите его в AppDelegate).
  • В Интерфейсном Разработчике подключите пункт меню к First Responder (красный куб) и выберите openUnFichier в списке. Первый класс в цепочке респондента, который реализует метод, выполнит его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...