代码之家  ›  专栏  ›  技术社区  ›  Optimalist

为什么带有子视图控制器的UIViewController有时会返回子视图[0]。isEmpty=true?

  •  0
  • Optimalist  · 技术社区  · 5 年前

    self.children[0].currentInfo = updatedInfo . 事实证明,在父视图控制器中的“普通”函数中,这一点工作得很好。但是从父视图控制器中的委托函数内部,它使程序崩溃。显然,有时但不总是 self.children.isEmpty = true 内部委托函数。

    在不知道原因的情况下,我不知道如何可靠地使用 self.children

    因为我的应用程序介绍了很多复杂的因素,所以我决定要研究一个非常简单的玩具。以下是我所拥有的(代码在故事板截图下方):

    enter image description here

    在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")
        }
    }
    
    2 回复  |  直到 5 年前
        1
  •  0
  •   Duncan C    5 年前

    这个 prepare(for:sender:) children 数组。)我没有测试过这个,但它是有意义的。 准备(收件人:发件人:) 在创建目标后立即调用,以便您有机会进行早期设置。)

    delegate 属性和测试。添加测试 amIAChildYet 方法,并在子视图控制器的委托属性的didSet()方法中调用它,以查看设置的顺序。

        2
  •  0
  •   Shehata Gamal    5 年前

    viewDidLoad 属于 MainViewController

    if let child = self.children.first as? TextViewController { 
      child.text = text 
      child.delegate = self
    }
    else {
      print("problem setting the child ",self.children.count)
    }