superview и parentviewcontroller nil после добавления подпредставления - PullRequest
5 голосов
/ 14 января 2010

Я думаю, что мне не хватает чего-то фундаментального, и поэтому я хочу попросить сообщество помочь. Я создаю приложение на основе базового приложения для iPhone. Мой MainView и FlipsideView имеют некоторые общие элементы, поэтому я создал отдельные ViewControllers и nib-файлы для этих частей. Для этого я сделал следующее: 1. Создал viewcontroller с именем searchDateViewController, который является владельцем файла searchDateView.xib 2. searchDateView.xib - это, по сути, UIView с UILabel внутри, представление подключено правильно 3. Внутри MainViewController.m и FlipsideViewController.m я добавляю подпредставление следующим образом:

- (void)loadView{
    [super loadView];
    searchDateViewController = [[SearchDateViewController alloc] initWithNibName:@"SearchDateView" bundle:nil];
    [[searchDateViewController view] setFrame:[searchDateView frame]];
    [[self view] addSubview:[searchDateViewController view]];

...
}

Все отображается и работает просто отлично. В основном, в зависимости от действий, которые происходят в каждом из основных и оборотных видов, изменяется UILabel пера. Однако я хотел сделать что-то немного другое, если searchDateViewController загружается из MainView или FlipsideView. Однако я не могу понять, какой ViewController добавляет подпредставление searchDateViewController.

В searchDateViewController я пытался:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"superview %@", self.view.superview);
    NSLog(@"parentviewcontroller %@", self.parentViewController);
}

В обоих случаях я получаю ноль.

Так что мой вопрос - могу ли я узнать, какой ViewController добавляет searchDateViewController в подпредставление? Если так, то как? Или, если моя логика здесь полностью испорчена, как мне это сделать?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 14 января 2010

viewDidLoad вызывается, когда контроллер представления загрузил свое представление.В вашем случае это происходит в этой строке:

[[searchDateViewController view] setFrame:[searchDateView frame]];

В тот момент вы еще не позвонили addSubview:, поэтому неудивительно, что суперпредставление представления равно nil.

ToЧтобы решить вашу проблему, вы должны определить свойство внутри SearchDateViewController, чтобы различать разные случаи.Это свойство затем будет соответственно установлено родительским контроллером, который создает экземпляр SearchDateViewController.

В общем, я не думаю, что будет хорошей идеей использовать подкласс UIViewController в качестве контроллера для представления, которое используется в качествеподпредставление одного или нескольких полноэкранных представлений, а не использование в качестве полноэкранного представления.Большая часть логики UIViewController работает в предположении, что он используется для управления полноэкранным представлением.Например, с вашим дизайном, я думаю, возможно, что SearchDateViewController изменит ориентацию представления при изменении ориентации устройства и т. Д. Поскольку вам не нужны все эти функции для не полноэкранного подпредставления, я предлагаю вам создать подкласс вашего SearchDateViewController напрямую из NSObject.

0 голосов
/ 14 января 2010

ViewController и представления полностью разделены.

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

Ваш SearchDate viewController не может найти родительский контроллер, потому что вы никогда не назначали его, и система не делает это автоматически. Вы можете просто назначить родительский контроллер, когда вызываете представление из другого контроллера.

searchDateViewController.parentController=self;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...