Доступ и управление родительскими представлениями контроллеров представления от представления контейнера 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];