Совместное использование UIView между несколькими UIViewControllers без перепрошивки фона - PullRequest
1 голос
/ 09 марта 2012

Есть ли способ поделиться 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

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 10 марта 2012

Я бы подошел к этому иначе. Почему бы не добавить представление в представление navController, а затем удалить его, если вы больше не хотите его видеть?

...