【问题标题】:viewDidload and viewDidAppear not being called?viewDidload 和 viewDidAppear 没有被调用?
【发布时间】:2017-06-12 13:32:18
【问题描述】:

我有 3 个视图控制器和一个容器视图控制器。我将这 3 个视图控制器添加为容器中的子视图控制器。当我启动应用程序时,我在所有执行的视图控制器中都有 viewDidload 和 viewDidAppear 中的打印语句。

问题是:当我“滚动”回这些视图并再次“出现”时,打印语句不会执行,viewDidAppear 和 viewDidLoad 中的任何代码也不会执行。为什么会这样?

这是我实例化视图控制器的代码。感谢您的帮助!

override func viewDidLoad() {
    super.viewDidLoad()

    scrollView.delegate = self



    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    page1 = storyboard.instantiateViewController(withIdentifier: StoryboardIdentifiers.feedViewController.rawValue) as! FeedViewController
    page1.view.translatesAutoresizingMaskIntoConstraints = false
    page1.delegate = self
    scrollView.addSubview(page1.view)
    addChildViewController(page1)
    page1.didMove(toParentViewController: self)

    page2 = storyboard.instantiateViewController(withIdentifier: StoryboardIdentifiers.favoritesViewController.rawValue) as! FavoritesViewController
    page2.view.translatesAutoresizingMaskIntoConstraints = false
    page2.delegate = self
    scrollView.addSubview(page2.view)
    addChildViewController(page2)
    page2.didMove(toParentViewController: self)

    page3 = storyboard.instantiateViewController(withIdentifier: StoryboardIdentifiers.settingsViewController.rawValue) as! SettingsViewController
    page3.view.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(page3.view)
    addChildViewController(page3)
    page3.didMove(toParentViewController: self)


}

【问题讨论】:

    标签: ios swift uiviewcontroller uiscrollview viewcontroller


    【解决方案1】:

    什么会触发这些视图控制器在其生命周期中循环?

    父视图控制器,无论它的名字是什么,都会在它的加载周期中运行。所有的意见也会贯穿他们的。 (我敢打赌,如果您将视图子类化并使用它,在 draw(rect:) 中放置一个断点,它会命中它。)但是没有什么可以触发子视图控制器做他们的事情。

    据我所知,您的视图层次结构是:

    • 主视图
    • 主视图内的滚动视图
    • 滚动视图内的三个页面视图

    当主视图(前面提到的父视图控制器)加载时,它会通过通常的viewDidLoadviewWillAppearviewWillLoadSubviews.... 那里以上视图中的一部分被加载、布局和绘制。

    没有发生任何事情来触发这三个页面控制器进行任何加载。

    【讨论】:

    • 感谢您的详细回答,您的要点是正确的。因此,根据我的理解,当我滚动到滚动视图内的 3 个视图控制器时, viewDidAppear 等不会因为它们被加载而再次被触发?即使我滚动到另一个? (对此真的很陌生!)我还想“什么会触发这些视图控制器循环它们的生命周期?”将是当我在该特定视图上滚动时,它会导致它执行。但我猜不是?
    • 我在你之前的问题中尝试过问这个问题——这 3 个 VC 的原因是什么?不要将 UIViews 与 UIViewControllers 混淆。 (对于新手来说这是一个常见的错误,我是针对你说的。)工作方式是“父 VC”控制滚动视图其中的所有视图。在我的应用程序的旧版本中,我有一个 UIPageView 和一个 UIScrollView,它们与其中的两个 GLKView(类似于 UIView)一起工作。所有这一切——加载图像、滚动窗口、改变页面控制——都是用一个 UIViewController 完成的。我会添加到这个....
    • 我将图像处理卸载到框架中的函数,因为我想共享该代码。我将自动布局卸载到另一个文件。我将滚动视图和页面视图委托的处理移至 UIViewController 扩展。否则,您将拥有一个庞大的视图控制器。我还做了一些其他的扩展。但是这两个 cmets 的要点是 - 我认为除非您有 特定需求(并且可能有一个)让您的视图在滚动视图中拥有自己的控制器,否则您将走下坡路具有意外副作用的路径。
    • 我不确定你在哪个时区,但如果你愿意,我会尝试从我的应用程序的旧版本中收集一些代码(我在私人 GitHub 存储库中有一些东西) .在接下来的 12 小时内我都没有空,所以可能要在 14 到 16 点左右才能安排好一切。保持这个问题开放。准备好后我会发布一个链接。
    • 感谢伟大的 cmets!我将在这里等待您的代码示例。基本上我有 3 个视图控制器,因为一个负责收集视图,另一个负责表格视图,最后一个负责设置屏幕。然后我将这 3 个添加到容器视图中(上面的代码示例)。 =]
    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2011-05-19
    • 2010-10-29
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多