Доступ и управление родительскими представлениями контроллеров представления от представления контейнера IOS

Я делаю приложение, в котором у меня есть представление контейнера, которое составляет половину экрана моего контроллера представления. Из класса контроллера представления контейнера я пытаюсь получить доступ и управлять представлением, которое находится вне представления контейнера. (картинка ниже)

Я пытаюсь получить доступ и добавить элементы в представление прокрутки из класса представления контейнера следующим образом:

parent = (GFProfileViewController*)[self parentViewController];
UIScrollView  *scroll = (UIScrollView *)[parent.view viewWithTag:222];
parent.titleHolders.contentSize = CGSizeMake(320 * 4,60);
UILabel *testLabel = [[UILabel alloc] init];
[testLabel setFrame:CGRectMake(0, 0, 100, 40)];
[testLabel setText:@"My Test label"];
[parent.titleHolders addSubview:testLabel];
scroll.backgroundColor = [UIColor blueColor];

как нибудь не получается. Я пытался даже получить доступ к представлению от родителей "представление с тегом" метод.

ни один не работает.

Я знаю, что код в порядке, потому что когда я перемещаю его в родительский vc, все работает как положено. Мне нужно иметь возможность манипулировать видом из контейнера, хотя. Кто-нибудь может помочь?

2 ответа

Решение

Как говорит Нгриф, не делай этого.

Вы должны рассматривать представления другого контроллера представления как частные.

Опять же, как говорит nhgrif, создайте открытый метод в родительском контроллере представления, который принимает необходимую информацию и выполняет само отображение.

Если контроллеры представления только инициализируются, то иерархия представления родительского контроллера представления может еще не существовать. В этом случае вы захотите установить свойства для хранения значений, которые вы хотите отобразить, а затем отобразить их в вашем методе viewWillAppear.

С раскадровками и iOS >= 6 вы можете настроить дочерний контроллер представления с помощью перехода, а затем в вашем методе prepareForSegue вы можете установить родительский контроллер представления в качестве делегата дочернего контроллера представления. Это чистый способ заставить ребенка общаться с родителями. (У меня есть пример приложения на github, который демонстрирует эту технику, если вам нужно более подробное объяснение.)

Что касается этики программирования, правильности, хороших практик и тому подобного, я думаю, что другие охватили это. То, что вы хотите сделать, конечно, не является правильным способом, но я часто нахожу себя на такие ярлыки, но вам действительно нужно знать, что вы делаете, и если это не вернется, чтобы укусить вас позже. Хорошая вещь состоит в том, что для выполнения требуется одна строка кода и очень низкие накладные расходы. Проблема в том, что такой подход сильно зависит от структуры представления, поэтому, если вы измените его, он больше не будет работать.

С этим, как говорится. То, что вы пробовали, не работает, потому что свойство parentViewController не установлено ни в каком произвольном представлении. Он должен быть определен только в главном представлении контроллера представления, доступ к которому можно получить из " viewController.view ".

Я предполагаю из вашего комментария, что ваша структура представления выглядит примерно так:

UIView
    UIView
        UIScrollView
    Container

Итак, в основном, начиная с контейнера, вам нужно подняться на один уровень вверх, а затем вниз до UIScrollView, например:

UIScrollView = [((UIView*)[self.superview.subviews objectAtIndex:0]).subviews objectAtIndex:0];

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

UIView *upperView = self;
while([upperView superview]){
    upperView = [upperView superview];
}
UIScrollView *scroll = [upperView viewWithTag:222];
Другие вопросы по тегам