我有以下代码将子视图控制器采用到父级:
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实用程序方法,正确地将子视图控制器引入父级,并将正确的事件引发正确的次数?
| 归档时间: |
|
| 查看次数: |
291 次 |
| 最近记录: |