SceneDelegate.swift для UISplitViewController внутри UITabBarController - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть контроллер разделенного вида внутри контроллера панели вкладок. При нажатии строки таблицы в главном контроллере представления контроллера раздельного представления делегат не запускается в контроллере подробного представления, и значение selectedWord не передается.

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let selectedWord = wordsDisplayed[indexPath.row]
        print("selectedWord in didSelectRowAt in wordsView is: \(selectedWord.languageWord)")
        delegate?.wordSelected(selectedWord)
        if let detailViewController = delegate as? wordsDetailView,
        let detailNavigationController = detailViewController.navigationController {
            splitViewController?.showDetailViewController(detailNavigationController, sender: nil)
        }
}
extension wordsDetailView: WordSelectionDelegate {
    func wordSelected(_ newWord: Word) {
        word = newWord
        print("word in WordSelectionDelegate in wordsDetailView is: \(word!.languageWord.components(separatedBy: "::")[0])")
        navigationItem.title = word?.languageWord.components(separatedBy: "::")[0]
        getImage()
        save.isEnabled = false
        clear.isEnabled = true
        share.isEnabled = true
    }
}

При нажатии кнопки в контроллере подробного представления, который зависит от значения selectedWord, программа завершается с ошибкой в ​​операторе печати, поскольку она разворачивает неожиданное значение nil:

@IBAction func save(_ sender: UIBarButtonItem) {
        // Create path.
        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        print("word in save in wordsDetailView is: \(word!)")
        let filePath = "\(paths[0])/\(word!.languageWord.components(separatedBy: "::")[1]).png"
        print("filePath in save in DetailWord is: \(filePath)")
        // Save image.
        do {
        try wordImage?.image?.pngData()?.write(to: URL(fileURLWithPath: filePath))
        } catch {
            print("Error saving image!")
        }
        save.isEnabled = false
    }

Переменная «word» объявлен в верхней части класса как:

var word: Word? {
        didSet {
          refreshUI()
        }
    }

Оператор print в didSelectRowAt в порядке, но в расширении контроллера подробного представления нет (ничего не печатается).

У меня есть более простой пример, который работает без контроллера панели вкладок, поэтому я подумал, что введение панели вкладок было причиной. У меня есть некоторый код в SceneDelegate.swift, который был написан до tabBarController, который обрабатывает настройку различных контроллеров представления. Переменная «слово» и делегат упоминаются. Я не уверен, если это нужно изменить, чтобы отразить добавление другого контроллера (панель вкладок), и как go об этом.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard
            let splitViewController = window?.rootViewController as? UISplitViewController,
            let leftNavController = splitViewController.viewControllers.first as? UINavigationController,
            let masterWordsController = leftNavController.viewControllers.first as? wordsView,
            let detailWordController = (splitViewController.viewControllers.last as? UINavigationController)?.topViewController as? wordsDetailView
            else { fatalError() }

        let firstWord = masterWordsController.wordsDisplayed.first
        print("firstWord in sceneWillConnectToOptions in SceneDelegate is: \(firstWord!)")
        detailWordController.word = firstWord
        masterWordsController.delegate = detailWordController
        detailWordController.navigationItem.leftItemsSupplementBackButton = true
        detailWordController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem
      }
}
...