iOS:正确地将视图引入已经可见的父级

Ken*_*art 10 c# ios xamarin

我有以下代码将子视图控制器采用到父级:

public static void AdoptViewController(this UIViewController parent, UIViewController child)
{
    parent.AddChildViewController(child);
    parent.View.AddSubview(child.View);
    child.DidMoveToParentViewController(parent);
}
Run Code Online (Sandbox Code Playgroud)

除非父视图已经可见,否则这种方法大多正常.在这种情况下,子视图控制器不会收到ViewWillAppear事件.这会导致整个应用程序出现连锁问题.

我发现这篇帖子,建议这样做:

public static void AdoptViewController(this UIViewController parent, UIViewController child)
{
    parent.AddChildViewController(child);

    child.BeginAppearanceTransition(true, false);
    parent.View.AddSubview(child.View);
    child.EndAppearanceTransition();

    child.DidMoveToParentViewController(parent);
}
Run Code Online (Sandbox Code Playgroud)

但是,这会导致在ViewWillAppear父级尚未显示的情况下将事件提升两次.我重新编写了一些代码:

public static void AdoptViewController(this UIViewController parent, UIViewController child)
{
    parent.AddChildViewController(child);

    // could also use ViewIfLoaded for later iOS versions
    var parentAlreadyVisible = parent.IsViewLoaded && parent.Window != null;

    if (parentAlreadyVisible)
    {
        child.BeginAppearanceTransition(true, false);
    }

    parent.View.AddSubview(child.View);

    if (parentAlreadyVisible)
    {
        child.EndAppearanceTransition();
    }

    child.DidMoveToParentViewController(parent);
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好,除了现在我的ViewDidAppear事件在子视图中触发两次!它第一次被触发EndAppearanceTransition,第二次似乎来自iOS本身.这实际上并没有给我带来任何问题,但它仍然令人不安.

如何编写一个独立的AdoptViewController实用程序方法,正确地将子视图控制器引入父级,并将正确的事件引发正确的次数?