Есть ли способ поделиться UIView между родительским и дочерним UIViewController без каких-либо заметных визуальных сбоев, когда он добавляется в дочернее представление как подпредставление?
У меня есть UIViewController и соответствующий ему UIView, рассматриваемый как «заголовок», который будет совместно использоваться родительским и дочерним UIViewController.(изобразите что-то вроде биржевого тикера, который будет присутствовать где-то на экране, на всех экранах приложения)
Когда дочерний UIViewController создается и перемещается для просмотра иерархии (я использую их с 'UINavigationController)'), я вижу, что его фоновая область заполнителя достигает максимума, прежде чем представление топ-заголовка добавляется в качестве подпредставления.
Я думал о создании уникального макета-заголовка для каждого экрана, но большинство представлений приложения разделяют этот заголовок.Таким образом, управление изменениями содержимого для всех них показалось сложным, и я пытаюсь выбрать более простой маршрут, имея 1 экземпляр.
Работа 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;
}
Реализация родительского 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;
}
Вот реализация дочернего 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
Любая помощь будет принята с благодарностью.