У меня есть контроллер разделенного вида внутри контроллера панели вкладок. При нажатии строки таблицы в главном контроллере представления контроллера раздельного представления делегат не запускается в контроллере подробного представления, и значение 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
}
}