Эта проблема возникла, когда я пытался передать updatedInfo из родительского UIViewController во встроенный / дочерний UIViewController, используя self.children[0].currentInfo = updatedInfo
. Как оказалось, внутри «обычной» функции в родительском контроллере представления это работало нормально. Но изнутри функции делегата в родительском контроллере представления это привело к сбою программы. Очевидно, иногда - но не всегда - self.children.isEmpty = true
внутри функций делегата.
Не зная причины этого, я не знаю, как можно надежно использовать self.children
для передачи информации. Но я не хочу просто избегать его использования, потому что я этого не понимаю. Любые идеи будут оценены.
Поскольку в моем приложении было слишком много усложняющих факторов, я решил изучить проблему, создав очень простое «игрушечное» приложение. Вот что у меня есть (код ниже скриншота раскадровки):
В файле MainViewController есть
import UIKit
class MainViewController: UIViewController, InfoDelegate {
var text = "Text from MainViewController"
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
printString("Text from MainViewController's viewDidLoad")
}
// Ordinary func
func printString(_ string: String) {
print(string)
print("In printString, self.children.isEmpty is \(self.children.isEmpty)")
}
// Delegate func
func messageString(_ string: String) {
print(string)
print("In messageString, self.children.isEmpty is \(self.children.isEmpty)")
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let textViewController = segue.destination as? TextViewController {
textViewController.text = text
textViewController.delegate = self
}
}
}
А в TextViewController есть
import UIKit
protocol InfoDelegate: AnyObject { func messageString(_ string: String) }
class TextViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
var text = "Text from TextViewController"
weak var delegate: InfoDelegate?
override func viewDidLoad() {
super.viewDidLoad()
textView.text = text
delegate?.messageString("Text from TextViewController's InfoDelegate")
}
}