在没有后台闪烁的情况下在多个UIViewControllers之间共享UIView

时间:2012-03-09 18:28:52

标签: iphone ios5 uiview uiviewcontroller

有没有办法在父级和子级UIViewController之间共享一个UIView,当它作为子视图添加到子视图时没有任何明显的视觉故障?

我有一个UIViewController及其相应的UIView,被视为“标头”,将在父和子UIViewController之间共享。 (图像类似于股票代码,将出现在屏幕上的某个位置,在应用程序的所有屏幕上)

当创建子UIViewController并将其推送到视图层次结构(我将它们与'UINavigationController'一起使用)时,我看到的是在将标头视图添加为子视图之前它的占位符背景区域达到峰值。

我考虑过为每个屏幕创建唯一的标头视图,但大多数应用的视图都会共享此标头。因此,管理所有这些内容的内容变化似乎很复杂,我试图通过一个实例来采用更简单的路径。

AppDelegate工作:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Other prep work, including setup of self.window
    UIViewController *vc = [[ParentViewController alloc] initWithNibName:nil 
                                bundle:[NSBundle mainBundle]];

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc];        

    self.window.rootViewController = navController;
}

Parent UIViewController实现:

@interface ParentViewController : UIViewController {}

@implementation ParentViewController()
- (void)viewDidLoad
{
    // The shared controller and its view has already been created and initialized.

    // Adding the masthead to my view
    [self.view addSubview:self.mastheadController.view];
    [super viewDidLoad];
}
- (void)showChildController
{
    DetailViewController *detailController = [[DetailViewController alloc] initWithNibName:nil
                           bundle:[NSBundle mainBundle]                                                                                 
                           withMastheadController:self.mastheadController];

    [self.navigationController pushViewController:detailController animated:YES];
    detailController = nil;
}

这是Child UIViewController的实现:

@interface DetailViewController : UIViewController {}

@implementation DetailViewController()
- (void)willMoveToParentViewController:(UIViewController *)parent
{
    // Since this method is invoked before our viewDidLoad and the 
    // parent's viewWillDisappear, remove shared view from parent view 
    // stack.
    [self.mastheadController.view removeFromSuperview];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Adding the shared masthead controller view to our view
    [self.view addSubview:self.mastheadController.view];                         
}

我正在使用willMoveToParentViewController的原因是因为我认为如果我等到'viewWillDisappear'被调用为ParentViewController,那么就没有足够的时间将mastheadView插入到子视图层次结构中而没有任何明显的效果。

这是我对视图出现/消失事件发生顺序的理解:

child:willMoveToParentViewController (parent will be null upon dismiss)
child:viewDidLoad
parent:viewWillDisappear
child:viewWillAppear

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我会采用不同的方法。为什么不将视图添加到navController的视图中,然后在您不想再看到它时将其删除?