【问题标题】:Make a view (initialized from initWithNibName) load all its subview使视图(从 initWithNibName 初始化)加载其所有子视图
【发布时间】:2016-03-11 10:40:24
【问题描述】:

假设我从一个 nib 加载一个视图控制器,并决定在幕后对它的一个子视图做一些事情。稍后,我会展示这个视图控制器的视图。

viewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
[viewController.someSubview doSomething];

//later on 
[mainView addSubview:viewController.view];

问题是,someSubview 对象似乎直到视图出现才被加载,所以方法 doSomething 没有被调用。到目前为止,我的解决方法是调用:

[mainView addSubview:viewController.view];
[viewController.view removeFromSuperview];

首先初始化viewcontroller的子视图。这个任务有没有更优雅的方法(比如 loadSubviews 方法或其他东西)?

【问题讨论】:

    标签: iphone uiview load subview


    【解决方案1】:

    首先我会尝试简单地访问该属性:

    [viewController view];
    

    这将强制视图(以及子视图和插座等)的延迟加载,这对您来说可能已经足够了。默认情况下,视图控制器在您访问它之前不会加载其视图,因此这可能是您看到延迟的原因。

    当您尝试访问出口属性但实际上尚未绑定时,强制这样的加载通常是解决方案,例如您的情况下的someSubview。

    您还可以通过添加视图但将其隐藏来稍微改进一下:

    viewController.view.hidden = YES;
    [mainView addSubview:viewController.view];
    

    那么当你想显示它时,不要调用addSubview,只需这样做:

    viewController.view.hidden = NO;
    

    我在使用UIViewAnimationTransitionFlipFromRight 等过渡在视图中制作动画时使用了这种方法。即使在强制延迟加载视图时仍然存在明显的延迟,所以我使用它来稍微提高性能。

    【讨论】:

    • @MarkAmery Apple 在文档中明确告诉您不要调用 -loadView :“您永远不应该直接调用此方法。视图控制器在请求其视图属性但当前为 nil 时调用此方法。这方法加载或创建视图并将其分配给视图属性。”
    • @MikeWeller 好点 - 我没有仔细查看文档以了解这一点。我想我们必须在两个略显丑陋的黑客中选择一个,然后。就我而言,我可能会坚持使用loadView,因为它更明确,但我承认这不是我认为的干净解决方案。
    【解决方案2】:

    iOS 9 引入-(void) loadViewIfNeeded

    我用

    if ([_myVC respondsToSelector:@selector(loadViewIfNeeded)]) {
        [_myVC loadViewIfNeeded];
    } else {
        [_myVC view];
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多