【发布时间】:2019-06-06 09:28:42
【问题描述】:
当我尝试使用 self.children[0].currentInfo = updatedInfo 将 updatedInfo 从父 UIViewController 传递到嵌入式/子 UIViewController 时出现此问题。事实证明,在父视图控制器的“普通”函数中,这工作得很好。但是从父视图控制器的委托函数内部,它使程序崩溃了。显然,有时(但并非总是)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")
}
}
【问题讨论】:
-
children数组永远不会为空,如果你正确地遵循了 vc 遏制 -
@Sh_Khan,我不知道您所说的“vc 遏制”指的是什么。我没有这样做吗?如果是,怎么做?
-
它是指以编程方式或通过 IB 中的 containerView 将子代添加到 vc
-
如截图所示,子vc是IB中的containerView添加的。所以大概我遵循了vc遏制,然后。然而,
children数组是空的。我错过了什么吗? -
viewDidLoad中是否为空??
标签: ios swift cocoa-touch uiviewcontroller delegation